명령 줄에서 php 스크립트를 실행합니다. 일반적으로 다음을 수행할 수 있습니다.
1.demo1.php
<?php
echo "hello php\n";
그 다음 스크립트를 실행합니다
php demo1.php
실행 결과:
2, demo2.php, 실행
which php
php 스크립트 명령이 어디에 있는지 확인합니다. 예를 들어, /usr/local/php/bin/php입니다. 그러면 demo2.php를 이렇게 쓸 수 있습니다
#!/usr/local/php/bin/php
<?php
echo "hello php\n";
그런 다음 chmod + x demo2.php를 실행하고 demo2.php를 실행 파일로 설정하면 우리가 셸을 쓰는 것과 같은 방식으로 스크립트를 실행하면 접두사 php 없이 ./demo2.php로 바로 실행할 수 있습니다
./demo2.php
두 가지 방법 모두 가능하며 일반적으로 작성된 php 스크립트는 crontab 시간 지정 작업에 사용되며 두 번째 방법으로 작성하는 것이 좋습니다.
이제 관련 지식 포인트를 소개하겠습니다.
1, CLI 프로그래밍, 명령줄 모드에서 쿠키, 세션은 모두 쓸모없으므로 사용하지 마십시오.이러한 내장된 초글로벌 변수를 사용합니다.session_start도 헛수고이고, session 파일이 생성되고, 다음에 실행할 때 또 하나의 파일이 생성되어 성능 낭비는 물론 session 파일이 공간을 차지합니다.다음은 반대의 예를 하나 들겠습니다, 명심하십시오, 이렇게 사용하지 마십시오
<?php
session_save_path(__DIR__);
session_start();
php demo3.php를 두 번 실행한 다음 ll에서 파일 목록을 보면 쓸모없는 session 파일이 두 개 더 나옵니다
2. set_time_limit이 유효하지 않습니다. 명령줄 모드 자체는 타임아웃 메커니즘이 없으므로 이렇게 쓸 필요가 없습니다.
3. PHP 버전 판단, PHP_VERSION 상수, version_compare 함수, 가능CLI에서만 사용할 수 없는 호환성 처리를 쉽게 할 수 있습니다.
php7.1.0은 pcntl_async_signa라는 새로운 함수를 제공합니다.ls는 pcntl_signal_dispatch를 대체하는 데 사용되며 낮은 버전의 php와 호환하기 위해 여러 버전과 호환되도록 이렇게 쓸 수 있습니다
#!/usr/local/php/bin/php
<?php
if(version_compare(PHP_VERSION, '7.1.0')>=0){
pcntl_async_signals(true);
}
pcntl_signal(SIGINT, function(){
echo "신호 트리거\n";
});
$i=0;
while(true){
if(version_compare(PHP_VERSION, '7.1.0')<0){
pcntl_signal_dispatch();
}
$i++;
echo $i,"\n";
sleep(1);
}
4, 프로세스 이름 cli_set_process_title, setproctitle을 설정하여 php 스크립트를 실행할 때, 우리는 아래의 코드를 이용하여 우리의 프로세스 이름을 설정할 수 있습니다. 예를 들어 장기간 실행되는 스크립트는 한 번에 하나만 실행할 수 있으며 반복할 수 없습니다. 프로그램의 이름을 설정할 수 있습니다. 실행할 때 현재 프로세스가 실행 중인 프로세스 이름이 있는지 조회하면 반복 여부를 판단할 수 있습니다
<?php
$pid = trim(`pidof learnPHPcli`);
if (!empty($pid)) {
exit('sorry');
}
function set_process_title($title)
{
set_error_handler(function () {});
// >=php 5.5
if (function_exists('cli_set_process_title')) {
cli_set_process_title($title);
} // Need proctitle when php<=5.5 .
elseif (extension_loaded('proctitle') && function_exists('setproctitle')) {
setproctitle($title);
}
restore_error_handler();
}
set_process_title("learnPHPcli");
//자신의 업무를 수행하기 위해 위의 코드가 중복되지 않도록 합니다。
echo "run";
sleep(10);
5. php_sapi_name 함수 실행 모드 체크, CLI 실행 여부 판단, 스크립트의 남용을 방지하기 위해 CLI 코드는 php-fpm 모드에서 실행해서는 안 된다.
<?php
// 물론 PHP_SAPI로 판단할 수도 있지만
if (php_sapi_name() != "cli") {
exit("only run in cli \n");
}
6. 현재 시스템이 당신의 코드 요구 사항을 충족하는지 판단합니다. Linux에서만 실행할 수 있는 경우 상수 PHP_OS 또는 DIRECTORY_SEPARATOR를 사용할 수 있습니다
<?php
if (DIRECTORY_SEPARATOR === '\\') {
exit('only run Unix-like');
}
7, register_argc_argv 설정이 true로 설정되어 있으므로 $argv $argc 변수를 사용하여 외부에서 제출된 매개변수의 수와 값을 얻을 수 있습니다
<?php
function test(){
global $argc,$argv;
echo $argc."\n";
print_r($argv);
}
test();
명령 실행:
php demo4.php hehe haha
결과는 다음과 같습니다
8. 물론 getopt도 인수를 얻기 위해 사용할 수 있습니다. -a-h 명령행 인수를 얻을 수 있습니다
<?php
$options="a:";
$longopts=["help:"];
$result= getopt($options,$longopts);
var_dump($result);
실행할 때, 매개변수를 사용할 수 있습니다
php demo5.php -a test --help long
결과는 다음과 같습니다
9. CLI 모드에서 php는 우리에게 세 가지 상수를 정의해 줍니다: STDIN, STDOUT, STDERR은 표준 입력, 표준 출력, 표준 오류에 사용됩니다. 우리가 인쇄하면 사실 세 가지 리소스 핸들입니다
<?php
var_dump(STDIN,STDOUT,STDERR);
STDIN을 사용하여 클라이언트의 입력을 받을 수 있습니다.
<?php
$res1= trim(fgets(STDIN));
$res2= trim(fgets(STDIN));
echo $res1,$res2,"\n";
실행:
php demo7.php
그런 다음 두 개의 값을 입력하여 줄바꿈으로 구분할 수 있습니다
STDOUT와 STDERR을 사용하여 표준 출력과 표준 오류를 출력합니다
<?php
fwrite(라이트)STDOUT, "표준 출력 \n";
fwrite(라이트)STDERR, "표준 오류\n";
표준 출력과 표준 오류는 모두 단말기로 출력되므로, 우리는 리다이렉트를 사용하여, 그들을 다른 곳으로 리다이렉트할 수 있다
php demo8.php 1>>out 2>>err
예를 들어 위의 예는 표준 출력을 파일 out으로 리디렉션하고 표준 오류를 파일 err로 리디렉션하는 것입니다.
10. php-m | grep "name" 을 사용할 수 있는 확장 모듈이 있는지 확인합니다.도리
php -m|grep pcntl
11. php의 구성 파일을 보려면 php --ini를 사용하여 찾을 수 있습니다
내 환경 설정 파일을 볼 수 있습니다.
/usr/local/php/etc/php-cli.ini
php의 구성 목록에서, 우리는 설정할 수 있습니다.php.ini 파일 두 개, 하나는 php.ini, 하나는 php-CLI.ini는 웹의 php-fpm에 해당하는 구성이고, 하나는 CLI 모드에 해당하는 구성으로 두 가지를 구별하며, 웹 모드에서 php.ini는 그다지 필요하지 않고 보안 문제를 일으킬 수 있는 일부 함수 또는 클래스를 비활성화하도록 구성할 수 있습니다
'개발 꿀팁 > PHP' 카테고리의 다른 글
PHP 미리 정의된 인터페이스의 ArrayAccess (0) | 2022.09.27 |
---|---|
PHP의 Trait 특성 (0) | 2022.09.27 |
php는 openssl을 사용하여 aes를 암호화하고 복호화한다 (0) | 2022.09.26 |
php 구현 데몬 (0) | 2022.09.26 |
[php] 너 정말 트라이캐치 할 줄 알아? (1) | 2022.09.23 |