>  기사  >  백엔드 개발  >  반드시 마스터해야 할 9가지 실용적인 PHP 기능

반드시 마스터해야 할 9가지 실용적인 PHP 기능

WBOY
WBOY원래의
2016-07-25 08:46:50964검색
이 기사는 Tuosheng Technology에서 발행했습니다. 내 WeChat toceansoft를 팔로우하세요

PHP를 수년간 사용해 오더라도 존재조차 몰랐던 기능과 특징을 우연히 발견하게 될 것입니다. 그 중 일부는 매우 유용하지만 활용도가 낮습니다. 모든 사람이 매뉴얼과 기능 참조 페이지를 처음부터 끝까지 읽는 것은 아닙니다!
1, 임의 개수의 매개변수를 사용하는 함수
이미 알고 계시겠지만, PHP에서는 선택적 매개변수를 사용하여 함수를 정의할 수 있습니다. 그러나 함수 인수의 수에 관계없이 완전히 허용하는 메서드도 있습니다. 다음은 선택적 인수의 예입니다.
// 2개의 선택적 인수가 있는 함수
function foo($arg1 = ”, $arg2 = ”) {
echo “arg1: $arg1n”;
echo "arg2: $arg2n";
}
foo('hello','world');
/* 인쇄:
arg1: 안녕하세요
인수2: 세계
*/
foo();
/* 인쇄:
인수1:
인수2:
*/
이제 임의 개수의 인수를 허용하는 함수를 생성하는 방법을 살펴보겠습니다. 이번에는 func_get_args() 함수를 사용해야 합니다:
// 예, 인수 목록은 비어 있을 수 있습니다
function foo() {
// 전달된 모든 인수의 배열을 반환합니다
$args = func_get_args();
foreach($args as $k => $v) {
echo "arg".($k 1).": $vn";
}
}
foo();
/* 아무것도 인쇄하지 않음 */
foo('hello');
/* 인쇄
arg1: 안녕하세요
*/
foo('hello', 'world', 'again');
/* 인쇄
arg1: 안녕하세요
인수2: 세계
arg3: 다시
*/
2, Glob()을 사용하여 파일 찾기
많은 PHP 함수에는 긴 설명 이름이 있습니다. 그러나 glob() 함수를 여러 번 사용하고 익숙해지지 않으면 glob() 함수가 무엇을 할 수 있는지 알기 어려울 수 있습니다. 패턴을 기반으로 파일을 검색할 수 있는 scandir() 함수의 더욱 강력한 버전이라고 생각하세요.
//모든 PHP 파일 가져오기
$files = glob('*.php');
print_r($files);
/* 출력은 다음과 같습니다:
배열
(
[0] =>phptest.php
[1] =>pi.php
[2] => post_output.php
[3] =>test.php
)
*/
다음과 같이 여러 파일을 얻을 수 있습니다:
// 모든 PHP 파일 및 txt 파일 가져오기
$files = glob('*.{php,txt}', GLOB_BRACE);
print_r($files);
/* 출력은 다음과 같습니다:
배열
(
[0] =>phptest.php
[1] =>pi.php
[2] => post_output.php
[3] =>test.php
[4] =>log.txt
[5] =>테스트.txt
)
*/
이러한 파일은 쿼리 조건에 따라 실제로 경로를 반환할 수 있습니다.
$files = glob('../images/a*.jpg')
print_r($files);
/* 출력은 다음과 같습니다:
배열
(
[0] => ../images/apple.jpg
[1] => ../images/art.jpg
)
*/
각 파일의 전체 경로를 얻으려면 realpath() 함수를 호출할 수 있습니다:
$files = glob('../images/a*.jpg ') ;
// 각 배열 요소에 함수를 적용합니다
$files = array_map('realpath',$files);
print_r($files);
/* 출력은 다음과 같습니다:
배열
(
[0] => C:wampwwwimagesapple.jpg
[1] => C:wampwwwimagesart.jpg
)
*/
3, 메모리 사용량 정보
는 스크립트의 메모리 사용량을 감지하여 코드를 최적화하는 데 도움을 줍니다. PHP는 가비지 수집기와 매우 정교한 메모리 관리자를 제공합니다. 실행하는 동안 스크립트에서 사용하는 메모리 양은 증가하거나 감소할 수 있습니다. 현재 메모리 사용량을 얻으려면 memory_get_usage() 함수를 사용할 수 있습니다. 어느 시점에서든 가장 높은 메모리 사용량을 얻으려면 memory_limit() 함수를 사용할 수 있습니다.
echo “초기: “.memory_get_usage().” 바이트 n”;
/* 인쇄
초기: 361400바이트
*/
// 메모리를 좀 써보자
for ($i = 0; $i $배열 []= md5($i);
}
// 배열의 절반을 제거해 보겠습니다
for ($i = 0; $i unset($array[$i]);
}
echo “최종: “.memory_get_usage().” 바이트 n”;
/* 인쇄
최종: 885912바이트
*/
echo “피크: “.memory_get_peak_usage().” 바이트 n”;
/* 인쇄
최대: 13687072바이트
*/
4, CPU 사용량 정보
이를 위해서는 getrusage() 함수를 사용해야 합니다. Windows 플랫폼에서는 이 기능을 사용할 수 없다는 점에 유의하세요.
print_r(getrusage());
/* 인쇄
배열
(
[ru_oublock] => 0
[ru_inblock] => 0
[ru_msgsnd] =>2
[ru_msgrcv] =>3
[ru_maxrss] =>12692
[ru_ixrss] =>764
[ru_idrss] =>3864
[ru_minflt] =>94
[ru_majflt] => 0
[ru_nsignals] =>1
[ru_nvcsw] =>67
[ru_nivcsw] =>4
[ru_nswap] => 0
[ru_utime.tv_usec] => 0
[ru_utime.tv_sec] => 0
[ru_stime.tv_usec] =>6269
[ru_stime.tv_sec] => 0
)
*/
이미 시스템 관리자 권한이 없다면 이는 다소 이상해 보일 수 있습니다. 다음은 각 값에 대한 설명입니다(기억할 필요 없음):
ru_oublock: 출력 작업 차단
ru_inblock: 입력 작업 차단
ru_msgsnd: 메시지가 전송되었습니다
ru_msgrcv: 메시지가 수신되었습니다
ru_maxrss: 최대 상주 세트 크기
ru_ixrss: 전체 공유 메모리 크기
ru_idrss: 비공유 데이터 전체 크기
ru_minflt: 페이지 회수
ru_majflt: 페이지 결함
ru_nsignals: 신호 수신됨
ru_nvcsw: 자발적인 컨텍스트 전환
ru_nivcsw: 비자발적인 컨텍스트 전환
ru_nswap: 교환
ru_utime.tv_usec: 사용자가 사용한 시간(마이크로초)
ru_utime.tv_sec: 사용자가 사용한 시간(초)
ru_stime.tv_usec: 사용된 시스템 시간(마이크로초)
ru_stime.tv_sec: 사용된 시스템 시간(초)
스크립트가 얼마나 많은 CPU 전력을 소비하는지 알려면 '사용자 시간' 및 '시스템 시간' 매개변수의 값을 살펴봐야 합니다. 초와 마이크로초 부분은 기본적으로 별도로 제공됩니다. 100만 마이크로초로 나누고 초 매개변수 값을 추가하면 총 초 수를 십진수 형식으로 얻을 수 있습니다. 예를 살펴보겠습니다.
// 3초 동안 수면(바쁨 없음)
sleep(3);
$data = getrusage();
echo "사용자 시간: ".
($data['ru_utime.tv_sec']
$data['ru_utime.tv_usec'] / 1000000);
echo "시스템 시간: ".
($data['ru_stime.tv_sec']
$data['ru_stime.tv_usec'] / 1000000);
/* 인쇄
사용자 시간: 0.011552
시스템 시간: 0
*/
스크립트를 실행하는데 약 3초가 걸렸음에도 불구하고 CPU 사용량은 매우 낮았습니다. 절전 모드 실행 중에 스크립트는 실제로 CPU 리소스를 소비하지 않습니다. 디스크 작업을 기다리는 것처럼 시간이 좀 걸리지만 CPU 시간을 차지하지 않는 다른 작업도 많이 있습니다. 보시다시피 CPU 사용량과 실제 런타임 길이가 항상 동일하지는 않습니다. 예는 다음과 같습니다.
// 천만 번 반복(바쁨)
for($i=0;$i<10000000;$i ) {
}
$data = getrusage();
echo "사용자 시간: ".
($data['ru_utime.tv_sec']
$data['ru_utime.tv_usec'] / 1000000);
echo "시스템 시간: ".
($data['ru_stime.tv_sec']
$data['ru_stime.tv_usec'] / 1000000);
/* 인쇄
사용자 시간: 1.424592
시스템 시간: 0.004204
*/
CPU 시간은 약 1.4초 정도 걸렸으나, 시스템 콜이 없기 때문에 거의 대부분이 사용자 시간이었습니다. 시스템 시간은 프로그램의 시스템 호출을 실행하는 데 소요된 CPU 오버헤드입니다. 예는 다음과 같습니다.
$start = microtime(true);
// 약 3초 동안 마이크로타임을 계속 호출합니다
while(microtime(true) – $start < 3) {
}
$data = getrusage();
echo "사용자 시간: ".
($data['ru_utime.tv_sec']
$data['ru_utime.tv_usec'] / 1000000);
echo "시스템 시간: ".
($data['ru_stime.tv_sec']
$data['ru_stime.tv_usec'] / 1000000);
/* 인쇄
사용자 시간: 1.088171
시스템 시간: 1.675315
*/
이제 시스템 시간이 꽤 많이 소요됩니다. 이는 스크립트가 microtime() 함수를 여러 번 호출하기 때문에 필요한 시간을 얻으려면 운영 체제에 요청해야 하기 때문입니다. 또한 실행 시간이 합산되면 3초 미만이 되는 것을 확인할 수 있습니다. 이는 동시에 서버에 다른 프로세스가 있고 스크립트가 전체 3초 동안 CPU를 100% 사용하지 않을 가능성이 있기 때문입니다.
5, 마법 상수
PHP는 현재 줄 번호(__LINE__), 파일 경로(__FILE__), 디렉터리 경로(__DIR__), 함수 이름(__FUNCTION__), 클래스 이름(__CLASS__), 메서드 이름(__METHOD__) 및 네임스페이스(__NAMESPACE__)를 가져오는 기능을 제공합니다. ) 등 유용한 마법 상수입니다. 이 글에서 그것들을 모두 다루지는 않겠지만, 몇 가지 사용 사례를 알려드리겠습니다. 다른 스크립트 파일을 포함할 때 __FILE__ 상수를 사용하세요(또는 PHP5.3에서 새로운 __DIR__ 상수를 사용하세요):
// 이는 로드된 스크립트의 경로에 상대적입니다
// 다른 디렉터리에서 스크립트를 실행할 때 문제가 발생할 수 있습니다
require_once('config/database.php');
// 이는 항상 이 파일 경로에 상대적입니다
//어디에 포함되었든 상관없음
require_once(dirname(__FILE__) . '/config/database.php');
__LINE__을 사용하면 디버깅이 더 쉬워집니다. 특정 라인 번호를 추적할 수 있습니다.
// 일부 코드
// ...
my_debug(“일부 디버그 메시지”,__LINE__);
/* 인쇄
4행: 일부 디버그 메시지
*/
// 추가 코드
// ...
my_debug(“또 다른 디버그 메시지”, __LINE__);
/* 인쇄
11행: 또 다른 디버그 메시지
*/
function my_debug($msg, $line) {
echo “라인 $line: $msgn”;
}
6, 고유 식별자 생성
일부 시나리오에서는 고유 문자열을 생성해야 할 수도 있습니다. 많은 사람들이 md5() 함수를 이 목적으로 사용하는 것은 아니지만 사용하는 것을 봅니다.
// 고유 문자열 생성
echo md5(time() . mt_rand(1,1000000));
실제로 이를 위해 사용되는 uniqid()라는 PHP 함수가 있습니다.
// 고유 문자열 생성
echo uniqid();
/* 인쇄
4bd67c947233e
*/
// 또 다른 고유 문자열 생성
echo uniqid();
/* 인쇄
4bd67c9472340
*/
문자열은 고유하지만 처음 몇 문자는 비슷하다는 것을 알 수 있습니다. 이는 생성된 문자열이 서버 시간을 기준으로 하기 때문입니다. 하지만 실제로는 새로 생성된 각 ID가 알파벳순으로 정렬되므로 정렬이 간단하다는 점에서 친근한 측면이 있습니다. 중복 가능성을 줄이려면 접두사 또는 두 번째 인수를 전달하여 엔트로피를 늘릴 수 있습니다.
// with prefix
echo uniqid('foo_');
/* 인쇄
foo_4bd67d6cd8b8f
*/
// 엔트로피가 더 높음
echo uniqid(",true);
/* 인쇄
4bd67d6cd8b926.12135106
*/
//둘 다
echo uniqid('bar_',true);
/* 인쇄
bar_4bd67da367b650.43684647
*/
이 함수는 md5()보다 짧은 문자열을 생성하여 공간을 절약합니다.
7, 직렬화
복잡한 변수를 데이터베이스나 텍스트 파일에 저장해야 하는 상황에 직면한 적이 있습니까? 문자열의 형식을 지정하고 이를 배열이나 객체로 변환하는 좋은 방법을 찾지 못할 수도 있습니다. PHP에는 이러한 기능이 준비되어 있습니다. 변수를 직렬화하는 두 가지 일반적인 방법이 있습니다. 다음은 serialize() 및 unserialize() 함수를 사용하는 예입니다.
// 복잡한 배열
$myvar = 배열(
안녕하세요'
42,
배열(1,'두'),
사과
);
// 문자열로 변환
$string = 직렬화($myvar);
echo $string;
/* 인쇄
a:4:{i:0;s:5:"안녕하세요";i:1;i:42;i:2;a:2:{i:0;i:1;i:1;s:3: "2";}i:3;s:5:"사과";}
*/
//원래 변수를 재현할 수 있습니다
$newvar = unserialize($string);
print_r($newvar);
/* 인쇄
배열
(
[0] =>안녕하세요
[1] =>42
[2] =>배열
(
[0] => 1
[1] => 두 개
)
[3] => )
*/
이것은 기본 PHP 직렬화 방법입니다. 그러나 최근 몇 년 동안 JSON의 인기로 인해 JSON 형식에 대한 지원이 PHP5.2에 추가되었습니다. 이제 json_encode() 및 json_decode() 함수를 사용할 수 있습니다:
// 복잡한 배열
$myvar = 배열(
안녕하세요'
42,
배열(1,'두'),
사과
);
// 문자열로 변환
$string = json_encode($myvar);
echo $string;
/* 인쇄
["안녕하세요",42,[1,"둘"],"사과"]
*/
//원래 변수를 재현할 수 있습니다
$newvar = json_decode($string);
print_r($newvar);
/* 인쇄
배열
(
[0] =>안녕하세요
[1] =>42
[2] =>배열
(
[0] => 1
[1] => 두 개
)
[3] => 사과
)
*/
이 방법은 더욱 효율적이며 특히 JavaScript와 같은 다른 많은 언어와 호환됩니다. 그러나 복잡한 개체의 경우 일부 정보가 손실될 수 있습니다.
8, 압축 문자열
압축이라고 하면 일반적으로 ZIP 압축 등 파일 압축을 떠올립니다. 문자열 압축은 PHP에서도 가능하지만 압축 파일은 포함되지 않습니다. 다음 예에서는 gzcompress() 및 gzuncompress() 함수를 사용합니다.
$string =
“Lorem ipsum dolor sit amet, consectetur
Adipiscing elit. Nunc ut elit id mi ultricies
adipiscing.
sapien vel feugiat 현관, nulla dui pretium orci,
Non ultricies elit lacus quis ante Lorem ipsum dolor
sit amet, consectetur adipiscing elit
Pretium ullamcorper urna quis iaculis
sed turpis tempor luctus. Curabitur sed nibh eu elit
mollis congue. Praesent ipsum diam, consectetur vitae
ornare a, aliquam a nunc.
Tellus posuere adipiscing. Sed non mi metus, at lacinia
augue. Sed magna nisi, ornare in mollis in, mollis
sed nunc. 레오 콩그 몰리스의 justo에서.
Neque eget metus hendrerit scelerisque의 Nullam
eu non enim. Ut Malesuada lacus eu nulla bibendum
id euismod urna sodales.";
$compressed = gzcompress($string);
echo "원본 크기: ".strlen($string)."n";
/* 인쇄
원본 크기: 800
*/
echo “압축 크기: “.strlen($compressed).”n”;
/* 인쇄
압축 크기: 418
*/
//돌려받기
$original = gzuncompress($compressed);
이 작업의 압축률은 약 50%에 도달할 수 있습니다. 추가 함수 gzencode() 및 gzdecode()는 다른 압축 알고리즘을 사용하여 비슷한 결과를 얻을 수 있습니다.
9, 등록 종료 기능
register_shutdown_function()이라는 함수가 있는데, 이 함수를 사용하면 특정 스크립트가 끝나기 전에 일부 기능을 실행할 수 있습니다. 실행 중입니다. 코드를 지정하세요. 스크립트 실행이 끝나기 전에 실행 시간 등 일부 기본 통계를 캡처해야 한다고 가정해 보겠습니다.
// 시작 시간 캡처
$start_time = microtime(true);
// 몇 가지 작업 수행
// ...
// 스크립트 소요 시간 표시
echo "실행 시간: ".
(마이크로타임(true) – $start_time).
"seconds.";
이는 사소해 보일 수 있습니다. 스크립트 실행 마지막에 관련 코드를 추가하기만 하면 됩니다. 그러나 exit() 함수를 호출하면 코드가 실행되지 않습니다. 또한, 치명적인 오류가 발생하거나 사용자에 의해 스크립트가 예기치 않게 종료된 경우 다시 실행되지 않을 수 있습니다. Register_shutdown_function() 함수를 사용하면 스크립트 실행이 중지되었는지 여부에 관계없이 코드가 계속 실행됩니다.
$start_time = microtime(true);
register_shutdown_function('my_shutdown');
//좀 해보세요
// ...
function my_shutdown() {
global $start_time;
echo “실행 시간: “.
(마이크로타임(true) – $start_time).
"초.";
}
제 글이 마음에 드셨다면 제 WeChat toceansoft를 팔로우해주세요



성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.