PHP는 유연한 작성과 빠른 실행이라는 장점으로 인해 효율적인 네트워크 프로그래밍 언어로 빠르게 웹 프로그래머가 선호하는 언어가 되었습니다. 얼마 전 권위 있는 조사에 따르면 현재 웹사이트의 31.6%가 PHP를 주요 서버측 프로그래밍 언어로 사용하고 있는 것으로 나타났습니다.
그러나 PHP 프로그래밍 마스터가 되기는 쉽지 않습니다. 복잡한 문제를 해결하기 위해 몇 가지 간단한 코드를 신속하게 작성할 수 있는 한, 실제 PHP 마스터는 다른 많은 문제도 고려해야 합니다. 다음 세 가지 지침은 성숙한 PHP 프로그래머가 프로그래밍에 있어서 먼저 따라야 할 지침입니다.
1. 게으름이 금이다
2. 아름다운 코드 작성
3. 프로그래밍 속도가 아닌 프로그래밍 속도를 추구하라
1. 게으름이 금이다
게으른 프로그래머이신가요? 이 아이디어는 정말 이상해요! 왜냐하면 아마도 세계에서 가장 바쁜 사람들은 컴퓨터 프로그래머일 것이기 때문입니다. 그러나 프로그래머가 너무 바쁘기 때문에 프로그래밍할 때 게으른 법을 배워야 합니다.
프로그래머에게는 두 가지 게으른 방법이 있습니다. 첫째, 다른 사람이 이미 만든 프로그램 코드를 대담하게 사용하고 이러한 코드를 자신의 프로그램이나 프로젝트에 통합하는 것입니다. 두 번째는 나중에 프로그램을 작성할 때 쉽게 사용할 수 있는 함수 라이브러리를 구축하기 위해 몇 가지 유용한 코드를 작성하는 것입니다. 이렇게 하면 반복적인 작업이 많이 줄어들고 자연스럽게 게으름이 줄어듭니다.
이 두 가지 게으른 방법은 PHP 프로그래머에게 매우 적합합니다.
우선, PHP는 자유롭고 개방적인 환경에서 탄생하고 성장한 언어입니다. 전 세계에는 PHP의 완벽함을 위해 끊임없이 노력해 온 수천 명의 프로그래머가 있으며, 그들은 또한 자신의 독창성과 자신이 작성한 코드를 다른 사람들과 기꺼이 공유하고자 합니다. 일부 PHP 웹사이트, 메일링 리스트, 뉴스 그룹에서 매일 훌륭한 프로그램 코드를 많이 찾을 수 있습니다. 이렇게 말함으로써 나는 다른 사람들이 당신을 위해 코드를 작성해 줄 때까지 하루 종일 기다리라고 권유하는 것이 아니라 "위대한 사람들의 어깨 위에 서서" 다른 사람들의 프로그램 코드를 스마트하게 적용하는 것을 충분히 홍보할 수 있습니다. 많은 시간을 절약해 보세요. 둘째, PHP에서는 자신만의 함수 라이브러리를 쉽게 구축할 수 있어 나중에 프로그램을 작성할 때 많은 수고를 덜 수 있습니다.
아래 작성자는 몇 가지 일반적인 기능을 소개합니다. 이러한 기능 중 일부는 인터넷의 일부 오픈 소스 프로젝트에서 제공되며 일부는 메일링 목록에서 선택됩니다. 자신의 라이브러리에 추가할 수 있다면 조만간 그 혜택을 누리게 될 것입니다.
1. 일반적인 데이터베이스 처리 기능
다른 CGI 기능에 비해 PHP의 장점 중 하나는 매우 강력한 데이터베이스 처리 기능을 가지고 있다는 것입니다. 그러나 PHP에서는 다양한 데이터베이스를 처리하기 위해 일부 특정 기능이 사용되며 일반적인 데이터베이스 처리 기능이 부족합니다. 이는 프로그램 코드의 이식성을 크게 감소시켜 프로그래밍 초보 친구들에게도 많은 불편을 안겨줍니다.
인터넷에서는 많은 프로그래머들이 클래스를 캡슐화하여 이 문제를 해결했습니다. 그들은 Linux 세계에서 널리 사용되는 Mysql이든 Windows 플랫폼에서 널리 사용되는 SqlServer이든 모든 인기 있는 데이터베이스를 처리하기 위한 통합 함수를 작성했습니다. 개인적으로 이러한 기능을 즐겨 사용하는 이유는 데이터베이스 연결이나 데이터베이스 핸들 등 복잡한 사항을 고려할 필요 없이 "query", "next_record" 등의 간단한 기능을 바로 사용할 수 있기 때문입니다. 어떤 데이터베이스를 사용하고 있는지 생각해 보세요. .
이러한 기능이 필요한 경우 다음 URL을 방문하여 얻을 수 있습니다.
http://phplib.netuse.de/
http://phpclasses.UpperDesign.com/browse.html/package/20
http://phpdb.linuxbox.com/
http://www.phpchina.com
2. 변수 디버깅 기능
PHP 프로그램의 디버깅은 항상 골치 아픈 일이었습니다. VB와 같은 고급 언어처럼 통합된 컴파일 및 디버깅 환경을 갖추고 있지도 않습니다. Perl과 같은 PHP 프로그램에서 사용할 수 있습니다. Linux 또는 DOS 환경에서 직접 실행됩니다. 실제로 echo 문을 유연하게 사용하여 PHP 디버깅을 완료할 수 있습니다.
다음 함수를 사용하면 언제든지 프로그램에 있는 모든 변수의 유형과 값을 확인할 수 있습니다.
함수 ss_array_as_string (&$array, $column = 0) {
$str = "배열(n");
while(list($var, $val) = 각각($array)){
for ($i = 0; $i < $column+1; $i++){
$str .= " ";
}
$str .= $var. ==> ;
$str .= ss_as_string($val, $column+1)." n";
}
for ($i = 0; $i < $column; $i++){
$str .= " ";
}
$str을 반환합니다.);
}
함수 ss_object_as_string (&$object, $column = 0) {
if (empty($객체->클래스명)) {
"$객체"를 반환합니다.
} 또 다른 {
$str = $object->클래스이름."(n";
while (list(,$var) = 각각($object->percious_slots)) {
for ($i = 0; $i < $column; $i++){
$str .= " ";
}
전역$$var;
$str .= $var. ==> ;
$str .= ss_as_string($$var, 열+1)." n";
}
for ($i = 0; $i < $column; $i++){
$str .= " ";
}
$str을 반환합니다.);
}
}
함수 ss_as_string (&$thing, $column = 0) {
if (is_object($thing)) {
return ss_object_as_string($thing, $column);
}
elseif (is_array($thing)) {
return ss_array_as_string($thing, $column);
}
elseif(is_double($thing)) {
return "Double(".$thing.")";
}
elseif(is_long($thing)) {
return "Long(".$thing.")";
}
elseif(is_string($thing)) {
return "String(".$thing.")";
}
또 다른 {
"알 수 없음(".$thing.")"을 반환합니다.
}
}
필요한 경우 프로그램에 다음 코드를 추가하기만 하면 프로그램에서 사용되는 변수(배열 및 개체 포함)의 유형과 값을 볼 수 있습니다.
echo ss_as_string($my_variable);
다음 명령문을 사용하면 프로그램의 모든 변수 값을 직접 볼 수 있습니다.
echo ss_as_string($GLOBALS);
3. 로그 정보를 제어하는 함수
PHP 프로그램을 디버깅하는 또 다른 중요한 방법은 로그 정보를 보는 것입니다. 로그 정보의 수준과 로그 정보의 표시 내용을 쉽게 제어할 수 있다면 프로그램 디버깅이 더욱 편리해질 것입니다. 다음 함수를 사용하면 이 기능을 쉽게 구현할 수 있습니다.
$ss_log_level = 0;
$ss_log_filename = /tmp/ss-log;
$ss_log_levels = 배열(
없음 => 0,
오류 => 1,
정보 => 2,
디버그 => 3);
함수 ss_log_set_level ($level = ERROR) {
전역 $ss_log_level;
$ss_log_level = $레벨;
}
함수 ss_log($레벨, $메시지) {
전역 $ss_log_level, $ss-log-filename;
if ($ss_log_levels[$ss_log_level] < $ss_log_levels[$level]) {
//로그 정보를 표시하지 않음
거짓을 반환;
}
$fd = fopen($ss_log_filename, "a+");
fputs($fd, $level. - [.ss_timestamp_pretty().] - .$message."n");
fclose($fd);
사실을 반환;
}
함수 ss_log_reset() {
전역 $ss_log_filename;
@unlink($ss_log_filename);
}
위 함수에는 4개의 로그 수준 변수가 있습니다. PHP 프로그램 실행 시, 로그 레벨이 설정된 레벨 값보다 낮은 경우에만 로그 정보를 기록하고 표시할 수 있습니다. 예를 들어, 프로그램에 다음 명령문을 추가하십시오.
ss_log_set_level(INFO);
그러면 PHP 프로그램 실행 시 ERROR, INFO 레벨의 LOG 정보만 기록 및 표시되며, DEBUG 레벨 정보는 무시됩니다. 또한 다음 명령문을 사용하여 표시되는 정보 내용을 설정할 수도 있습니다.
ss_log(ERROR, "테스트 수준 ERROR");
ss_log(INFO, "테스트 레벨 INFO");
ss_log(DEBUG, "testing level DEBUG");
다음 명령문을 사용하여 언제든지 LOG 정보를 지울 수도 있습니다.
ss_log_reset();
4. 속도 테스트 기능
코드를 최적화하기 위해서는 코드의 실행 시간을 테스트하여 최적의 코드를 선택할 수 있는 메소드가 필요합니다. 다음 함수는 코드를 실행하는 데 필요한 시간을 테스트할 수 있습니다.
function ss_timing_start ($name = 기본값) {
글로벌 $ss_timing_start_times;
$ss_timing_start_times[$name] = 폭발( , 마이크로타임());
}
함수 ss_timing_stop ($name = 기본값) {
글로벌 $ss_timing_stop_times;
$ss_timing_stop_times[$name] = 폭발(, 마이크로타임());
}
함수 ss_timing_current ($name = 기본값) {
전역 $ss_timing_start_times, $ss_timing_stop_times;
if (!isset($ss_timing_start_times[$name])) {
0을 반환합니다.
}
if (!isset($ss_timing_stop_times[$name])) {
$stop_time = 폭발(, 마이크로타임());
}
또 다른 {
$stop_time = $ss_timing_stop_times[$name];
}
$current = $stop_time[1] - $ss_timing_start_times[$name][1];
$current += $stop_time[0] - $ss_timing_start_times[$name][0];
$현재를 반환합니다;
}
이제 모든 코드의 실행 시간을 쉽게 확인할 수 있습니다. 동시에 여러 타이머를 사용할 수도 있습니다. 위 함수를 사용할 때 타이머 이름으로 다른 매개변수를 설정하기만 하면 됩니다.
5. 데이터베이스 작업 디버깅 및 최적화
데이터베이스의 경우 실행 속도가 중요합니다. 많은 책과 기사에서 데이터베이스를 빠르게 실행하는 방법을 가르치지만 모든 방법은 실제로 테스트되어야 합니다. 다음으로, PHPLib 함수 라이브러리의 query() 함수와 위에서 소개한 함수들을 결합하여 새로운 query() 함수를 작성하겠습니다. 원래 함수와 비교하면 이 함수는 실행 시간 모니터링 기능을 추가합니다.
함수 쿼리($Query_String, $halt_on_error = 1) {
$this->연결();
ss_timing_start();
$this->Query_ID = @mysql_query($Query_String,$this->Link_ID);
ss_timing_stop();
ss_log(INFO, ss_timing_current().Secs - .$Query_String);
$this->행 = 0;
$this->Errno =mysql_errno();
$this->오류 =mysql_error();
if ($halt_on_error && !$this->Query_ID) {
$this->halt("잘못된 SQL: ".$Query_String);
}
return $this->Query_ID;
}
2. 아름다운 코드 작성
1. 백엔드 프로그램과 프론트엔드 프로그램을 분리하세요.
PHP 프로그램을 작성할 때 일부 코드는 데이터베이스 운영, 수학 연산 수행 등과 같은 일부 트랜잭션을 처리하는 데 사용되는 반면 다른 코드는 코드는 트랜잭션 처리에만 사용됩니다. echo 문을 사용하여 결과를 웹 브라우저에 HTML 형식으로 표시하는 일부 PHP 코드와 PHP 프로그램에 직접 포함된 HTML 코드와 같은 결과가 표시됩니다. 우선, 우리는 이 두 가지 유형의 코드를 명확하게 구별해야 합니다. 전자를 백그라운드 프로그램이라고 부르고 후자를 프런트엔드 프로그램이라고 부릅니다.
PHP는 내장형 프로그래밍 언어이기 때문에 모든 PHP 코드를 HTML 코드에 내장할 수 있어 프로그램 작성에 많은 편의성을 제공합니다. 그러나 극단적으로 진행하면 반대로 해야 합니다. 긴 프로그램에 PHP 코드와 HTML 코드를 혼합하면 프로그램이 지저분해지고 프로그램 유지 관리 및 읽기에 불리해집니다. 따라서 이러한 프로그램에는 HTML 코드에 혼합된 PHP 코드를 최대한 이식하고, 이러한 코드를 특수 파일의 함수로 캡슐화한 다음 HTML 코드의 include 문을 사용하여 이러한 파일을 적절한 위치에 포함시켜야 합니다. 이 함수를 호출하면 됩니다.
한편으로 이 접근 방식은 HTML 코드와 PHP 코드를 모두 간단하고 읽기 쉽게 만드는 반면, HTML 코드는 지속적으로 업데이트되어야 하기 때문에 이 분리 방법을 사용하면 백그라운드 프로그램이 파괴되지 않도록 할 수 있습니다. .
백엔드 프로그램은 프론트엔드 프로그램과 달리 안정성과 구조를 추구하고 변화가 거의 없기 때문에 신중하게 설계하고 관리해야 합니다. 실제로 데스크탑 프로그램을 디자인할 때 많은 시간을 투자할 가치가 있습니다. "지금 나무를 심고 나중에 그늘을 즐기세요." 지금 작성하는 배경 프로그램을 향후 디자인 작업에 쉽게 사용할 수 있을 것입니다.
2. 포함 파일의 유연한 사용
앞서 언급했듯이 백그라운드 프로그램은 일련의 포함 파일로 배열되어야 합니다. 포함된 파일은 필요할 때 include 문을 통해 동적으로 로드할 수도 있고, php.ini 파일의 auto_prepend_file 지시어를 사용하여 미리 자동으로 로드할 수도 있습니다.
후자의 방법을 사용하면 단번에 이점을 얻을 수 있지만 주의할 만한 몇 가지 단점도 있습니다. 다음 코드는 대규모 포함 파일을 구문 분석하는 데 걸리는 시간을 보여줍니다.
require(timing.inc);
ss_timing_start();
include(test.inc);
ss_timing_stop();
에코
.ss_timing_current().
?>
위 코드에서 test.inc는 1000줄의 포함 파일입니다. 실행 결과를 보면 이 포함 파일을 구문 분석하는 데 0.6초가 걸리는 것으로 나타났습니다. 대규모 웹사이트의 경우 이 속도는 무시할 수 없습니다.
인클루드 파일을 사용할 때의 또 다른 단점은 파일의 구문에 오류가 발생하면 전체 웹사이트의 PHP 프로그램이 실행되지 않는다는 점입니다. 그러니 매우 조심해서 사용하세요.
실제로 인클루드 파일을 약간만 처리하면 필요할 때만 인클루드 파일을 구문 분석할 수 있습니다. 다음 코드는 프로그램에서 필요할 때만 abc.inc 파일을 구문 분석하도록 합니다.
if (defined(__LIBA_INC)) return;
정의(__LIBA_INC, 1);
/*
* 코드...
*/
?>
3. 객체지향 프로그래밍 방법을 사용하세요
. PHP도 객체지향 언어입니다. 객체지향 프로그래밍 방법은 뛰어난 프로그래머들이 높이 평가하는 소프트웨어 설계 방법입니다. PHP 프로그래밍에서는 객체지향 언어의 장점을 최대한 활용할 수 있습니다. . 프로그래밍에서 객체를 캡슐화하는 것이 장점입니다. 이전 코드에서는 객체 지향 방식을 사용했습니다. 예를 들어 데이터베이스를 관리할 때 query() 함수를 데이터베이스 클래스에 캡슐화하여 코드 관리를 크게 촉진하고 프로그램의 가독성을 높였습니다.
3. 프로그래밍 속도보다는 프로그램 속도를 추구하세요.
웹사이트 구축에서는 프로그램 실행 속도와 웹페이지 다운로드 속도가 성패를 좌우하는 중요한 요소입니다. 웹 프로그래머라면 코드 실행 속도에 더 많은 주의를 기울여야 합니다. 아래에 소개된 여러 가지 방법은 모두 코드의 실행 속도를 다양한 수준으로 향상시킵니다.
1. PHP의 echo 문 대신 내장된 HTML 코드를 사용하세요.
PHP는 내장형 웹 프로그래밍 언어이기 때문에 HTML 코드와 PHP 코드가 서로 내장될 수 있습니다. 그러나 많은 프로그래머들은 HTML 코드에 PHP 코드를 삽입하기 위해 ""를 과도하게 사용하면 PHP 인터프리터를 여러 번 호출하여 PHP 코드의 실행 속도가 저하될 것을 우려합니다. 따라서 HTML 코드를 출력하는 대신 PHP의 echo 문을 사용하는 것이 좋습니다. HTML 코드를 직접 사용하세요. 그러나 진실은 정반대입니다. 각 PHP 페이지는 PHP 인터프리터를 한 번만 호출하여 모든 PHP 코드를 해석합니다. 따라서 필요한 경우에만 PHP 코드를 삽입하고 대부분의 경우 HTML 코드를 직접 사용하여 결과를 입력하면 프로그램의 실행 속도가 느려질 뿐만 아니라 또한 echo 문의 구문 분석이 줄어들기 때문에 코드 실행 속도가 향상되는 경우가 많습니다.
다음 코드는 우리의 결론을 보여줍니다. 이 코드에서는 앞서 소개한 시간 테스트 기능을 사용합니다.
ereg-replace 대신 str-replace를 사용하세요.
Perl 프로그래밍에 익숙한 프로그래머는 문자열 대체 작업을 완료하기 위해 ereg_replace를 더 선호합니다. 왜냐하면 PHP에서 ereg_replace의 사용법은 Perl의 패턴 일치 사용법과 유사하기 때문입니다. 그러나 다음 코드는 ereg_replace 대신 str_replace를 사용하면 코드 실행 속도가 크게 향상된다는 것을 증명합니다.
str_replace 및 ereg_replace의 실행 속도를 테스트합니다.
//이 코드는 str_replace의 실행 속도를 테스트합니다.
강조 ?>
for ($i=0; $i<1000; $i++) {
str_replace(i>, b>, $string).
}
?>
//이 코드는 ereg_replace의 실행 속도를 테스트합니다.
for ($i=0; $i<1000; $i++) {
ereg_replace(<([/]*)i>, <1b>, $string).
}
?>
//
str_replace 시간을 사용하여
결과결론을
인쇄합니다. -
ereg_pattern 사용 시간 -
위 코드를 실행하면 결과는 다음과 같습니다.
str_replace 사용 시간 - 0.089757
ereg_pattern 사용 시간 - 0.248881
실행 결과에서 문자열 대체 함수로 ereg_replace 대신 str_replace를 사용하면 코드 실행 속도가 크게 향상되는 것을 확인할 수 있습니다.
3. 문자열 인용에 주의하세요.
PHP는 다른 많은 프로그래밍 언어와 마찬가지로 큰따옴표("")를 사용하여 문자열을 인용하거나 작은따옴표()를 사용할 수 있습니다. 그러나 PHP에서는 큰따옴표를 사용하여 문자열을 인용하면 PHP 파서는 먼저 문자열에 변수에 대한 참조가 있는지 분석합니다. 변수가 있으면 해당 변수를 대체합니다. 작은따옴표인 경우 그다지 복잡하지 않습니다. 작은따옴표로 묶인 모든 문자열이 직접 표시됩니다. 분명히, PHP 프로그래밍에서는 큰따옴표보다 작은따옴표를 사용하여 문자열 변수를 인용하는 것이 더 빠릅니다.
4. 데이터베이스에서 공동 작업을 사용하지 마십시오.
다른 웹 프로그래밍 언어에 비해 PHP의 데이터베이스 기능은 매우 강력합니다. 그러나 PHP에서 데이터베이스를 실행하는 것은 여전히 시간이 많이 걸리고 노동 집약적인 문제입니다. 따라서 웹 프로그래머는 데이터베이스 쿼리 작업을 최소화하고 데이터베이스에 적합한 인덱스를 설정해야 합니다. 또 한 가지 주목할 점은 PHP를 사용하여 데이터베이스를 운영할 때 여러 데이터 테이블의 공동 작업을 사용하지 않는 것입니다. 공동 작업은 데이터베이스의 쿼리 기능을 향상시킬 수 있지만 서버에 대한 부담을 크게 증가시킵니다.
이 문제를 설명하기 위해 아래의 간단한 예를 살펴보겠습니다.
데이터베이스에 두 개의 데이터 테이블 foo와 big_foo를 생성했습니다. 데이터 테이블 foo에는 1부터 1000까지의 모든 자연수를 포함하는 필드가 하나만 있습니다. 데이터 테이블 big_foo에도 필드가 하나만 있지만 1부터 1,000,000까지의 모든 자연수가 포함되어 있습니다. 따라서 크기 측면에서 big_foo는 foo 자체와 결합된 것과 같습니다.
$db->query("foo에서 *를 선택하세요");
0.032273초
$db->다음_기록();
0.00048999999999999초
$db->query("foo 값에 삽입(NULL)");
0.019506초
$db->query("foo를 a로, foo를 b로 * 선택");
17.280596초
$db->query("foo를 a로 선택 *, foo를 b로 선택(a.id > b.id");
14.645251초
$db->query("foo를 a로, foo를 b로 선택 * a.id = b.id");
0.041269초
$db->query("big_foo에서 *를 선택하세요");
25.393672초
위의 연산 결과를 보면 1,000개의 레코드가 있는 두 개의 데이터 테이블을 합치는 속도가 1,000,000개의 레코드가 있는 대용량 데이터 테이블을 별도로 연산하는 것보다 그리 빠르지 않다는 것을 알 수 있습니다.
5. include와 require의 차이점에 주의하세요.
PHP 프로그래밍에서 include()와 require()는 동일한 기능을 가지고 있지만, include()는 조건부 포함 함수인 반면 require()는 사용 방식에 약간의 차이가 있습니다. 무조건적인 기능을 포함합니다. 예를 들어, 다음 예에서 $sogthing 변수가 true이면 somefile 파일이 포함됩니다.
if($something){
include("어떤 파일");
}
그러나 $something의 값이 무엇이든 관계없이 다음 코드는 somefile 파일을 파일에 포함합니다.
if($something){
require("어떤 파일");
}
다음의 흥미로운 예는 이 두 함수의 차이점을 보여줍니다.
$i = 1;
동안 ($i < 3) {
require("somefile.$i");
$i++;
}
이 코드에서 프로그램은 루프할 때마다 동일한 파일을 포함합니다. 분명히 이것은 프로그래머의 원래 의도가 아닙니다. 코드에서 우리는 이 코드가 각 루프에 다른 파일을 포함하기를 원한다는 것을 알 수 있습니다. 이 기능을 완료하려면 include() 기능을 사용해야 합니다.
$i = 1;
동안 ($i < 3) {
include("somefile.$i");
$i++;
}
6. echo와 print의 차이점에 주의하세요.
PHP에서 echo와 print의 기능은 기본적으로 동일하지만 둘 사이에는 미묘한 차이가 있습니다. PHP 코드에서 일반 함수로 print를 사용할 수 있습니다. 예를 들어 다음 코드를 실행하면 $res 변수의 값은 1이 됩니다.
$ret = print "Hello World";
이는 일부 복잡한 표현식에 print를 사용할 수 있지만 echo는 사용할 수 없음을 의미합니다. 마찬가지로, echo 문은 반환되는 값이 필요하지 않기 때문에 echo 문은 코드의 print 문보다 약간 빠르게 실행됩니다.