검색결과 리스트
2010/04/06에 해당되는 글 4건
- 2010/04/06 [펌] PHP 프로그램 브라우저 캐시 적용(아이헬퍼스)
- 2010/04/06 무조건 알아야 할 PHP 속도 테스트 20 가지
- 2010/04/06 [PHP] php code 수준의 caching
- 2010/04/06 [펌] PHP 코드를 최적화하는 40가지 팁 (번역)
글
Dev/php 2010/04/06 09:43[펌] PHP 프로그램 브라우저 캐시 적용(아이헬퍼스)
아래는 PHP 프로그램 중에서 브라우저 캐시를 이용할 경우 아래의 코드를 활용하시면 됩니다.
아래는 ETag 을 파일크기와 수정일자만 적용한 경우입니다. ( 기본값은 파일노드, 크기, 수정일자 )
<?
$filename = $_SERVER["SCRIPT_FILENAME"];
$etag->mtime = filemtime($filename);
$etag->size =
filesize($filename);
$apacheheader = apache_request_headers();
if(isset($apacheheader['If-Modified-Since']))
{
$ims = strtotime(preg_replace('/;.*$/', '',
$apacheheader['If-Modified-Since']));
if($etag->mtime == $ims) {
header('HTTP/1.1 304');
$etag->end = true;
}
}
header('Cache-Control: private, max-age=3600');
header('Pragma:
cache');
header('Last-Modified:
'.substr(gmdate('r', $etag->mtime), 0, -5).'GMT');
header('ETag:
'.dechex($etag->size).'-'.dechex($etag->mtime));
if(isset($etag->end))
exit;
echo time();
?>
트랙백
댓글
글
Dev/php 2010/04/06 09:39무조건 알아야 할 PHP 속도 테스트 20 가지
★ 무조건 알아야 할 PHP 속도 테스트 20 가지 ◆◇◆◇◆◇
이
속도 테스트 보다 더 중요한 것이 PHP보안 입니다. 보안이 가장 중요함당 !!!
PHP로 코딩 함에
있어서 알아야 할 속도 테스트 입니다.
조금더 빠른 PHP 속도를 유지 하기 위한 것이죠 ^^
작
은 것이 모여서, 대따 오랜 시간이 걸릴 수 가 있는 것 입니다. !!
되도록이면 속도가 빠른 것을 사용하시는 것이
좋습니다.
물론 함수 마다 기능 마다 장단이 있지만요....^^
다른 비교가
있으면 알려주셍 ^^ 답변 달아 주세용 ^^
계속 적으로 업글 됩니다.
★ mysql 총
게시물 수 세기
$numresults=mysql_query("select code from $board");
$numrows=mysql_num_rows($numresults);
//2초 이상 ...게시물 10만개
VS
$numresults=mysql_query("select count(code) as code from $board");
$row_num=mysql_fetch_array($numresults);
$numrows=$row_num[code];
// 0.2 ...게시물 10만개
?
아래것이 훠얼씬 빠름다..
도대체 mysql_num_row() 는 왜 만들어 놓은 것일까용???
★ mysql_fetch_row > mysql_fetch_array >>> mysql_result 입니다.
row 가 array 보다 약간 빠르고, result 보다는 훠얼씬 빠름당 ^^
row 는 불편한게 숫자로 칼럼을 불러와서 불편합니다.
array 가 약간 느리지만, 문자 칼럼을 불러 올 수 있으니 array 쓰는 것도 양호 ^^
아 직도 mysql_result() 를 사용하시나요?
★print , echo ,printf 함수 속도 비교
HTML 출력 >> echo > print >> printf
print 와 printf 함수는 복잡한곳에 적격이고, 약간 느리다.
echo 는 단순한곳에 적격이고...빠르다.
printf 는 형식화된 출력을 해주므로 그래도 좋죠 ^^
★ 인라인
a.php
$aa="sdsdsdsd";
echo ("
| $aa |
");
?>
위 랑..
b.php
랑 도대체 어케 코딩 하느냐죠 ?
솔직히 코딩은 a.php 가 편합니다.
를 한번 만 쓰니까 효율적일 수 있습니당..
그 러나 아무리 아무리 PHP가 빠르다고 해도 HTML 이 더 빠릅니당.. !!!
쿠쿠쿠
b.php 처럼 코딩 하는 습관을 가지세용 ^^
변수가 많아 질 경우 b.php 파일이 느립니다.
그러나 소스 코드 분리 측면에서는 b.php 파일 형태가 좋습니다.
이 부분은 여러분들이나 저나 각종소스를 가지고 연구해 봐야만 할검당 ^^
★ zend cache , APC ,Bware 캐쉬 비교
Zend cache > APC > Bware
zend cache 는 캐쉬 입니다. 울나라에서 포탈에서도 몇군데 사용하죠.
PHP 프로그램 변환 없이 속도를 빠르게 해 줍니다. ^^
zend cache 를 살 돈이 없으시다구용?
그러면 APC 나 zend optimizer 를 반드쉬 설치 하세용 !!
■ 그런디 Zend Cache 만한 무료 캐쉬가 나왔다고 합니당...^^
http://www.php-accelerator.co.uk/index.php
도대체 캐쉬의 작동 원리는 어케 되는가?
캐쉬는 여러가지로 작동 할 수 있습니다.
가장 많이 아는 것이 메모리에 페이지를 띄워 놓고 읽어 오는 것입니다.
하드에서 읽는 것 보다 빠르기 때문이죠.
그리 고 HTML 로 만드는 것도 캐쉬 입니다.조금 더 빠르다면 캐쉬 라고 할 수 있습니다.
게시판 목록 보기 페이지는 디비 연결이 많습니다. 쓰기 보다 , 읽기가 20배 정도 많습니다.
게시판을 마니 운영해 봤다면 아시겟죠 ^^?
그 래서 게시판 목록을 HTML 로 저장 시키고, 쓰기, 삭제 가 있을때 마다 HTML 로 만들어 주는 것 입니다.
그러면 디비 부하는 상당히 줄어 듭니다.
또는 코딩을 할때 enter 이나 tab 키를 많이 사용해서 합니다.
저번 에 본 캐쉬는 enter 이나 tab 키를 없에 주는 캐쉬 였습니다.
enter 이나 tab 를 없엘 경우 최대 1-2k 정도 절약이 되죵 ^^
★ ereg_replace <<< preg_replace 정규표현식
ereg_replace () 가 장난 아니게 느림다.
40개 정도 변환 하는데 1초나 걸려요.preg_replace 는 0.3초 정도요.
되도록이면 preg_replace() 를 사용하세요 !!!
www.php.net/preg_replace
tood.net preg_replace 강좌
http://www.tood.net/tood/toodboard/toodread.php?board=tootech&tcode=907
★ foreach , list 함수 속도 차이 35%
foreach($string as $a); >>> while(list(,$a) = each($string));
foreach() 를 사용하는 것이 35% 정도 빠릅니다...!!
★ explode() Vs split() Vs preg_split
explode() 와 split() 와 preg_split 는 문자열을 자르는 함수 입니다.
테스뚜 해보시면 아시겟지만 explode() 가 훨 빠릅니당..!!!
70% 정도 빠릅니다.
★mysql_connect Vs mysql_pconnect
서로 장단이 있다 합니다.
mysql_pconnect 가 더 빠르다고 합니다.
persistant
메뉴얼에 영구적인 이렇게 되어 있으니까요..
일정시간 동안 mysql 을 열어 놓기 때문에, 다시 열 필요가 없어서 빠르다고 합니다.
단점은 계속 열기 때문에 메모리를 많이 잡아 먹슴당...^^
mysql_pconnect 경우는 최소 메모리가 1G 이상 되어야 사용하시는 것이 좋습니다.
★ 큰따옴표(") , 작은 따옴표(')
큰따옴표는 PHP가 파싱을 합니다. 그러나 작은 따옴표는 파싱을 하지 않습니다.
작은 따옴표를 사용하시는 것이 빠릅니다.
코딩시 echo ' test '.$aaa.' tood ';
요런식으로 하시는 게 가장 빠름당 !!
★ mysql 데이터 저장 공간 크기 ?
id int(11) unsigned NOT NULL auto_increment,
bbs smallint(5) unsigned NOT NULL,
lens mediumint(8) unsigned NOT NULL,
int 도 무자게 많슴당..
각각의 크기에 맞게 하는 것이 속도가 빨라 집니당 ^^
not null 를 주는 것도 속도가 빨라 집니당..
작은 사이트 조회수 경우 1만을 넘기도 힘듭니다. 그럴 경우 smallint 를 사용하시면 됩니다.
★ where 절에 모든 것은 인덱스를 걸어라 !!!
mysql 에서 쿼리시에 where 절에 사용되는 비교의 칼럼은 반드쉬 인덱스를 거세용 !!!
mysql 인덱스 가 여러 분들의 게시판 속도를 업 시켜 줍니당 !!
★ 메인페이지에서 속도를 빠르게 하려면, .htm 으로 만드는 것이 좋습니다.
그러니까..제 사이트 페이지 오른쪽 에는 모두 최신 게시물로 디비를 불러오는 부분
입니다.
디비 연결은 부하를 줄 수 있습니다.
그 러니까..이예는 사이트가 상당히 활성화된 사이트일 경우 입니다.
하루에 2번 정도 .htm 으로 만들어 페이지를 업시키는 것이 좋습니다.
아무리 PHP가 빨라도 HTML 보다는 빠르지 않습니다.. !!!
HTML 로 만드는 것은 생각 할것이 게시판 목록수 만큼 파일이 생성이 됩니다. 1만개 게시물이면 1만개 HTML
이 생기죠. 그런데 조회수가 보통 1000-3000 을 넘는 게시판 경우는 효율성이 중대 됩니다.
그러나 조회수가 100 비스므리 하다면...생각해봐야 합니다.
그러기 위해서는 ★cron 를 알아야 합니다 PHP강좌 게시판에서 cron 으로 검색하세용 !!
윈도우 사용자는 멀 쓰는지 잘 모르겠슴당...아시면 답글 부탁 ^^
★ 초보자 Vs 전문가
www.zend.com 에서 제가 2000년 5월에 퍼온건데용 ^^
함 주석을 붙일까 해서용^^
Beginner vs Experienced
Author: Boaz Yahav
Date 23/05/2000
Beginner : echo "$var";
Experienced : echo $var;
Beginner:echo "PHP"; ;
Experienced : ?>PHP color="#0000CC">
◆ "(따옴표) 가 굉장히 중요한것이라는 한 대목이죵 ^^
전 보통의 경우 php 변수 값이 들어갈 경우는 초보자 처럼 쓰구요 ^^ 안들어 갈 경우 는 전문가 처럼 씀다.
Beginner : $a[0]=1; $a[1]=2; $a[2]=3;
Experienced : $a = array(1,2,3, 1);
둘다 사용하는 데요. 전문가 쪽이 편함다. ^^
Beginner : if($a>1) { $b=2; } else { $b=3; }
Experienced : $b = ($a>1) ? 2:3;
요건 완존히 소스 어렵게 짜는 넘이 최고 라는 소리 같네용 ^^
전문가 쪽것은 C 언어 에서 배웠는데도 역시 전 if 씀다. ^^
Beginner : $result=mysql_query(...);
Experienced: $result=mysql_query(...) OR die
(mysql_error());
요즘 들어 새삼 전문가 쪽으로 씀다.^^
보통의 경우
$result=mysql_query(...)
if (!$result)
{
echo error()."
";
echo errno();
}
?>
이렇게 사용함다. ^^
or 이
설명이고 no 가 에러 번호 일 검다. ^^
★MySQL,ADODB,PHPLib,PEAR
벤치마킹
ADODB > PHPlib > PEAR
MySQL 1.14 -
ADODB
1.45 27%
PHPLib 1.60 40%
PEAR 2.87 152% (fetchInto)
MySQL,ADODB,PHPLib,PEAR
는 모두 데이터베이스 인가요? 당근 아닙니다.
MySQL만 데이터베이스 구요.
ADODB,PHPLib,PEAR 는
PHP 프로그램 입니다.
3개 다 MySQL연결을 편하게 하는 클래스 프로그램 입니다.
그런디 벤치 마킹
결과 MySQL 에서 직접 쿼리하는 것 다음으로 ADODB 가 뽑혔슴당 ^^
PEAR 가 굉장히 늦군요. PEAR
DB 나 ADODB 를 사용해 보았는데, 움..역시나 ADODB 가 좋군요.
오라클, mysql , ms sql 연결시
1개의 API 만 사용할 수 있는 프로그램 들 이 PEAR 과 ADODB 입니당 ^^
★
페이지 네비게이션- 페이지 분활
페이지 분활도 속도 차이가 납니다. 각각의 페이지 분활을 테스트 해보시면
아시겟지만,
10만개,20만개의 데이터를 넣어 보세요. 빠른것은 0.03초 정도, 느린것은 3초나 걸립니다.
인
덱스를 걸어서 빨리 뜨는데, 머가 늦는 걸까 했는데, 페이지 네비게이션 알고리즘이 문제더군요. ^^
★
속도 테스트는 어케 하는가 ? microtime() 사용하면 됩니다.
function
pageTime($page) {
$mstart = explode(" ", $m);
$mend = explode("
", microtime());
$mtime = ($mend[1] - $mstart[1]) + ($mend[0] -
$mstart[0]);
echo " $m[1] $mend[1]
";
echo " $m[0] $mend[0]
";
print("tood.net 페이지 로딩 시간 : " . $mtime . "
microseconds");
}
pageTime(basename($PHP_SELF));
?>
조
금 더 빠른 쿼리
$sql = "SELECT table.column FROM table WHERE
criteria LIKE $myrow[variable]";
아래 처럼 하면 파싱 되지 않기 때문에 아주 아주 쪼금
빨라 짐다..0.0000x 초;
$sql = "SELECT table.column FROM table WHERE
criteria LIKE " . $myrow['variable'];
최적화 컴파일 옵션
사용 !
PHP counfigure 시에 최적화 방법 입니다.
http://www.tood.net/tood/toodboard/toodread.php?board=tootech&tcode=1070
트랙백
댓글
글
Dev/php 2010/04/06 09:27[PHP] php code 수준의 caching
주어진 데이터 셋에서 사본 평균, 중앙값 등의 자료를 추출한 다음
PHP의 GD library를 활용해서 그래프를 그려주는 작업이었다.
통계 데이터의 변화에 따라 지속적인 그래프 값이 변경되는 연산이 필요하기에
[ img src="graph.php"
]
이런 형태로 img 파일을 불러들임에 있어서 gif 등을 바로 사용하지 않고
php로부터 데이터를 받아오도록 구현하였다.
그래프를 그려주는 부분은 기존에 다른 사람이 작업했던 부분이 있어서
기존 코드를 해석해서 붙이기만 하면 되었는데,
문제는 그래프를 생성하는데 꽤 많은 시간이 소요된다는 점이었다. 약 5초
그래서 php 코드 수준에서 캐싱 방법을 활용하여 이 문제를 해결하였다.
우선, http://blog.naver.com/fantom80/40021008290 에서 제시하는 코드를 보자.
<?php
$reqfilename = "index";
$cachefile = "cache/".$reqfilename.".xanadu";
$cachetime = 5 * 60; //5 minutes
// Serve from the cache if it is younger than $cachetime
if (file_exists($cachefile) && (time() - $cachetime <
filemtime($cachefile))) {
include($cachefile);
echo "<!-- Cached ".date('jS F Y H:i', filemtime($cachefile))."
-->\n";
exit;
}
// start the output buffer
ob_start();
?>
Here is Page-Content home
<?
$fp = fopen($cachefile, 'w'); // open the cache file for writing
fwrite($fp, ob_get_contents()); // save the contents of output buffer
to the file
fclose($fp); // close the file
// Send the output to the browser
ob_end_flush();
?>
ob_start(); 와 ob_end_flush(); 를 사용해서 전체 출력을 특정 파일에 저장한다.
그리고 그 파일이 또 요쳥 되는 경우, 기존에 저장한 cache 파일을 include 해서
같은 연산을 다시 하지 않도록 만드는 아주 멋진 코드이다.
물론,
로그인한 유저에 따라 다르게 출력되야 되는 부분이 있다거나
아주 빈번하게 페이지가 변경된다거나 하는 등의 경우가 있으므로,
모든 페이지를 이렇게 작성해서는 안될 것이다.
나는 페이지 요청을 캐싱한 것이 아니라,
GD 라이브러리를 사용해 생성한
이미지 생성에 있어서 캐싱을 사용하였다.
그런데 문제는, 나의 php 파일은 raw gif 데이터를 바로 반환 하는 것이었고,
echo "<!-- Cached ".date('jS F Y H:i', filemtime($cachefile))."
-->\n"; 따위를 뒤에 덧붙이면 당연히 에러가 나는 상황
즉, 위의 코드는 캐싱하는 데이터가 모두 텍스트 혹은 php 코드로 구성되어있을때만 그 효과를 발휘한다.
특히 이미지 raw data 등은 include를 사용하면 괴 글자가 코드로 작동하게 되므로,
안드로메다 급의 에러를 만나게 된다.
(글을 쓰면서 생각해 보니 쌩 text라 하더라도. echo나 print 등 없이 include만 하면 안될텐데... - _-;;
)
여간 그래서 나는
include($cachefile); 부분을
$file = open($cachefile, "rb");
echo fread($file,filesize($cachefile));
로 대체하였고
파일을 저장할때도 wb로 저장해서
binary 코드가 그대로 잘 저장이 되고 반환이 되도록 변경하였다.
See also
GD library : http://bluesunh.springnote.com/pages/629687
php caching : http://blog.naver.com/fantom80/40021008290
refernce : www.developertutorials.com
트랙백
댓글
글
Dev/php 2010/04/06 09:18[펌] PHP 코드를 최적화하는 40가지 팁 (번역)
가끔 PHP로 웹페이지를 작성할 일이 있는데, 유용한 팁을 우연히 보게 되어 한글로 옮겨적어본다.
원본은 40 Tips for optimizing your php
Code
1. If a method can be static, declare it static. Speed improvement is by a
factor of 4.
메쏘드가 static이 될 수 있다면 static으로 선언하라. 4배 빨라진다.
2. echo is faster than print.
echo가 print보다 빠르다.
3. Use echo’s multiple parameters instead of string concatenation.
문자열을
이어붙이지 말고, echo를 이용하여 여러 개의 파라미터를 적어라.
4. Set the maxvalue for your for-loops before and not in the loop.
for 루프을
위핸 최대값(탈출조건)을 루프 안에서가 아니고 루프 시작 이전에 지정하라.
5. Unset your variables to free memory, especially large arrays.
메모리를 해제하기
위해 변수를 unset하라. 특히 커다란 배열은 그래야 된다.
6. Avoid magic like __get, __set, __autoload
__get, __set, __autoload와 같은
마법을 피해라.
7. require_once() is expensive
require_once()는 비싸다.
8. Use full paths in includes and requires, less time spent on resolving the
OS paths.
include와 require를 사용할 때, 경로를 찾는데 시간이 적게 걸리는 full path를 사용하라.
9. If you need to find out the time when the script started executing,
$_SERVER[’REQUEST_TIME’] is preferred to time()
스크립트가 언제 실행했는지 알고 싶으면
time()보다 $_SERVER[’REQUEST_TIME’]이 좋다.
10. See if you can use strncasecmp, strpbrk and stripos instead of
regex
정규표현식보다는 가능하면 strncasecmp나 strpbrk, stripos를 사용하라.
*
역주
strncasecmp: 두 문자열의 앞쪽 일부가 대소문자 구분없이 일치하는지 확인할 때 사용
strpbrk: 문자 집합에 속한
특정 문자가 문자열에 나타나는지 확인할 때 사용
stripos: 대소문자 구분없이 특정 문자열이 다른 문자열에 포함되는지 확인할 때
사용
11. str_replace is faster than preg_replace, but strtr is faster than
str_replace by a factor of 4
str_replace가 preg_replace보다 빠르지만, strtr은
str_replace보다 4배 빠르다.
12. If the function, such as string replacement function, accepts both arrays
and single characters as arguments, and if your argument list is not too long,
consider writing a few redundant replacement statements, passing one character
at a time, instead of one line of code that accepts arrays as search and replace
arguments.
만약 문자열 교체 같은 함수가 배열과 문자열을 인자로 받아들이면, 그리고 그 인자 리스트가 길지 않다면, 배열을 한
번에 받아들여서 처리하는 것 대신에 한 번에 문자열을 하나씩 넘겨서 처리하는 것을 고려해봐라.
13. It’s better to use select statements than multi if, else if,
statements.
여러 개의 if/else if 문장 대신에 select 문장을 사용하는 게 더 좋다.
14. Error suppression with @ is very slow.
@를 이용한 에러 출력 방지는 매우 느리다.
15. Turn on apache’s mod_deflate
Apache의 mod_deflate를
켜라.
*역주
mod_deflate는 서버의 출력을 클라이언트에게 보내기 전에 압축하는 모듈임
16. Close your database connections when you’re done with them
DB를 다 사용했으면
연결을 닫아라.
17. $row[’id’] is 7 times faster than $row[id]
$row[’id’]가 $row[id]보다 7배
빠르다.
18. Error messages are expensive
에러 메시지는 비싸다.
19. Do not use functions inside of for loop, such as for ($x=0; $x <
count($array); $x) The count() function gets called each time.
for 루프의 표현식
안에서 함수를 사용하지 마라.
for ($x = 0; $x < count($array); $x)에서 count() 함수가 매번
호출된다.
20. Incrementing a local variable in a method is the fastest. Nearly the same
as calling a local variable in a function.
메쏘드 안에서 지역 변수를 증가시키는 것이 거의 함수 안에서
지역 변수를 호출(증가?)하는 것만큼 빠르다.
21. Incrementing a global variable is 2 times slow than a local var.
전역
변수를 증가시키는 것이 지역 변수를 증가시키는 것보다 2배 느리다.
22. Incrementing an object property (eg. $this->prop++) is 3 times slower
than a local variable.
객체의 멤버변수를 증가시키는 것이 지역 변수를 증가시키는 것보다 3배 느리다.
23. Incrementing an undefined local variable is 9-10 times slower than a
pre-initialized one.
값이 지정되지 않은 지역 변수를 증가시키는 것이 미리 초기화된 변수를 증가시키는 것보다 9~10배
느리다.
24. Just declaring a global variable without using it in a function also
slows things down (by about the same amount as incrementing a local var). PHP
probably does a check to see if the global exists.
전역 변수를 함수 안에서 사용하지 않으면서 그저
선언하기만 해도 (지역 변수를 증가시키는 것만큼) 느려진다. PHP는 아마 전역 변수가 존재하는지 알기 위해 검사를 하는 것 같다.
25. Method invocation appears to be independent of the number of methods
defined in the class because I added 10 more methods to the test class (before
and after the test method) with no change in performance.
메쏘드 호출은 클래스 안에서 정의된
메쏘드의 갯수에 독립적인 듯 하다. 왜냐하면 10개의 메쏘드를 테스트 클래스에 추가해봤으나 성능에 변화가 없었기 때문이다.
26. Methods in derived classes run faster than ones defined in the base
class.
파생된 클래스의 메쏘드가 베이스 클래스에서 정의된 것보다 더 빠르게 동작한다.
27. A function call with one parameter and an empty function body takes about
the same time as doing 7-8 $localvar++ operations. A similar method call is of
course about 15 $localvar++ operations.
한 개의 매개변수를 가지고 함수를 호출하고 함수 바디가
비어있다면(함수 내부에서 아무것도 실행하지 않는다면) 그것은 7~8개의 지역변수를 증가시키는 것과 똑같은 시간을 차지한다. 비슷한 메쏘드 호출은
마찬가지로 15개의 지역변수를 증가시키는 연산쯤 된다.
28. Surrounding your string by ‘ instead of ” will make things interpret a
little faster since php looks for variables inside “…” but not inside ‘…’. Of
course you can only do this when you don’t need to have variables in the
string.
문자열을 이중 따옴표 대신에 단일 따옴표로 둘러싸는 것은 좀 더 빠르게 해석되도록 한다. 왜냐하면 PHP가 이중 따옴표 안의
변수를 찾아보지만 단일 따옴표 안에서는 변수를 찾지 않기 때문이다. 물론 문자열 안에서 변수를 가질 필요가 없을 때만 이렇게 사용할 수
있다.
29. When echoing strings it’s faster to separate them by comma instead of
dot. Note: This only works with echo, which is a function that can take several
strings as arguments.
문자열을 echo할 때 마침표 대신에 쉼표로 분리하는 것이 더 빠르다.
주의: 이것은 여러
문자열을 인자로 받아들이는 함수인 echo로만 작동한다.
30. A PHP script will be served at least 2-10 times slower than a static HTML
page by Apache. Try to use more static HTML pages and fewer scripts.
Apache에
의해 PHP 스크립트는 정적 HTML 페이지보다 최소 2에서 10배 느리게 서비스된다. 더 많은 정적 HTML 페이지와 더 적은 스크립트를
사용하려고 노력하라.
31. Your PHP scripts are recompiled every time unless the scripts are cached.
Install a PHP caching product to typically increase performance by 25-100% by
removing compile times.
PHP 스크립트는 캐시되지 않으면 매번 재 컴파일된다. 컴파일 시간을 제거함으로써
25~100%만큼의 성능을 증가시키기 위해 PHP 캐싱 도구를 설치하라.
32. Cache as much as possible. Use memcached - memcached is a
high-performance memory object caching system intended to speed up dynamic web
applications by alleviating database load. OP code caches are useful so that
your script does not have to be compiled on every request
가능한 한 많이 캐시하라.
memcached를 사용하라. memcached는 고성능 메모리 객체 캐싱 시스템이다.
33. When working with strings and you need to check that the string is either
of a certain length you’d understandably would want to use the strlen()
function. This function is pretty quick since it’s operation does not perform
any calculation but merely return the already known length of a string available
in the zval structure (internal C struct used to store variables in PHP).
However because strlen() is a function it is still somewhat slow because the
function call requires several operations such as lowercase & hashtable
lookup followed by the execution of said function. In some instance you can
improve the speed of your code by using an isset() trick.
문자열을 가지고 작업하며 문자열이
특정 길이인지 확인할 필요가 있을 때, strlen() 함수를 쓸 것이다. 이 함수는 계산없이 zval 구조체에서 사용할 수 있는 이미 알려진
문자열 길이를 반환하기 때문에 매우 빠르다. 그러나 strlen()이 함수이기 때문에 여전히 조금 느리다. 왜냐하면 함수 호출은 언급된 함수의
실행 뒤에 lowercase와 hashtable lookup같은 여러 개의 연산을 호출하기 때문이다. 어떤 경우에는 isset() 트릭을
이용하여 코드의 스피드를 증가시킬 수도 있다.
Ex.
if (strlen($foo) < 5) { echo "Foo is too short"; }
vs.
if
(!isset($foo{5})) { echo "Foo is too short"; }
Calling isset() happens to be faster then strlen() because unlike strlen(),
isset() is a language construct and not a function meaning that it's execution
does not require function lookups and lowercase. This means you have virtually
no overhead on top of the actual code that determines the string's
length.
isset()을 호출하는 것은 strlen()과는 달리 isset()이 언어 기본문법이고 함수가 아니기 때문에 함수 찾와
lowercase 작업을 필요로 하지 않으므로 strlen()보다 더 빠를 수도 있다. 이것은 가상적으로 문자열의 길이를 결정하는 실제 코드에
과부하가 없다는 것을 의미한다.
34. When incrementing or decrementing the value of the variable $i++ happens
to be a tad slower then ++$i. This is something PHP specific and does not apply
to other languages, so don't go modifying your C or Java code thinking it'll
suddenly become faster, it won't. ++$i happens to be faster in PHP because
instead of 4 opcodes used for $i++ you only need 3. Post incrementation actually
causes in the creation of a temporary var that is then incremented. While
pre-incrementation increases the original value directly. This is one of the
optimization that opcode optimized like Zend's PHP optimizer. It is a still a
good idea to keep in mind since not all opcode optimizers perform this
optimization and there are plenty of ISPs and servers running without an opcode
optimizer.
변수 $i의 값을 증가시키거나 감소키킬 때, $i++은 ++$i보다 조금 더 느릴 수 있다. 이것은 PHP의 특징이고
다른 언어에는 해당되지 않으니 좀 더 빨라질 것을 기대하면서 C나 Java 코드를 바꾸러 가지 마라. 안 빨라질 것이다. ++$i는 PHP에서
좀 더 빠른데 그것은 $i++에 4개의 opcode가 사용되는 대신에 3개만 필요하기 때문이다. 후증가는 사실 증가될 임시변수의 생성을
초래한다. 반면에 전증가는 원래 값을 직접 증가시킨다. 이것은 opcode가 Zend의 PHP optimizer처럼 최적화하는 최적화 기법의
하나이다. 모든 opcode optimizer들이 이 최적화를 수행하는 것은 아니고 많은 ISP와 server들이 opcode
optimizer없이 수행되고 있기 때문에 명심하는 게 좋을 것이다.
35. Not everything has to be OOP, often it is too much overhead, each method
and object call consumes a lot of memory.
모든 것이 OOP일 필요는 없다. 종종 그것은 너무 많은
과부하가 된다. 각각의 메쏘드와 객체 호출은 메모리를 많이 소비한다.
36. Do not implement every data structure as a class, arrays are useful,
too
모든 데이터 구조를 클래스로 구현하지 마라. 배열도 유용하다.
37. Don't split methods too much, think, which code you will really
re-use
메쏘드를 너무 많이 분리하지 마라. 어떤 코드를 정말 재사용할지 생각해봐라.
38. You can always split the code of a method later, when needed
항상 메쏘드의
코드를 나중에 필요할 때 분리할 수 있다.
39. Make use of the countless predefined functions
수많은 미리 정의된 함수를
활용해라.
40. If you have very time consuming functions in your code, consider writing
them as C extensions
매우 시간을 소비하는 함수가 있다면, C 확장으로 작성하는 것을 고려해봐라.
41. Profile your code. A profiler shows you, which parts of your code
consumes how many time. The Xdebug debugger already contains a profiler.
Profiling shows you the bottlenecks in overview
당신의 코드를 프로파일해봐라. 프로파일러는 코드의
어떤 부분이 가장 많은 시간을 소비하는지 보여준다. Xdebug 디버거는 이미 프로파일러를 포함하고 있다. 프로파일링은 전체적인 병목을
보여준다.
42. mod_gzip which is available as an Apache module compresses your data on
the fly and can reduce the data to transfer up to 80%
Apache 모듈로 사용가능한
mod_gzip은 실행 중에 데이터를 압축하여 전송할 데이터를 80%까지 줄일 수 있다.
43. Excellent Article about optimizing php by John Lim
John Lim의 PHP를 최적화하는 것에 관한 뛰어난 글
RECENT COMMENT