많은 사람들이 PHP 예약 작업이 무엇인지 모르지만 일상적인 개발에서 PHP 프로그램은 종종 작업 계획을 실행하고 정기적으로 실행해야 하므로 오늘은 php 예약 작업을 소개하겠습니다. 원리 분석 실현!
php 매뉴얼을 바탕으로 관련 지식에 대한 간략한 소개:
1. 연결 처리:
PHP 내부에서 시스템은 연결 상태를 유지하며 상태에는 세 가지 가능한 상황이 있습니다. :
0 - NORMAL(정상)
1 - ABORTED(비정상 종료)
2 - TIMEOUT(시간 초과)
PHP 스크립트가 NORMAL 상태에서 정상적으로 실행되면 연결이 유효합니다. 원격 클라이언트의 연결이 끊어지면 ABORTED 상태 플래그가 켜집니다. 원격 클라이언트 연결 중단은 일반적으로 사용자가 중지 버튼을 클릭하면 발생합니다. 연결 시간이 PHP의 시간 제한을 초과하면 TIMEOUT 상태 플래그가 켜집니다.
클라이언트 연결이 끊어질 때 스크립트를 종료해야 하는지 여부를 결정할 수 있습니다. 어떤 원격 브라우저도 스크립트의 출력을 받아들이지 않더라도 스크립트를 완전히 실행하는 것이 편리한 경우가 있습니다. 기본값은 원격 클라이언트 연결이 끊어지면 스크립트가 종료되는 것입니다.
이 처리는 php.ini의 ignore_user_abort
또는 Apache .conf의 해당 "<code>php_valueignore_user_abort
" 및 ignore_user_abort에 의해 수행될 수 있습니다. code> 설정()
함수를 제어합니다. ignore_user_abort
或由 Apache .conf
设置中对应的"php_value ignore_user_abort
"以及 ignore_user_abort()
函数来控制。
如果没有告诉 PHP 忽略用户的中断,脚本将会被中断,除非通过 register_shutdown_function() 设置了关闭触发函数。通过该关闭触发函数,当远程用户点击 STOP 按钮后,脚本再次尝试输出数据时,PHP 将会检测到连接已被中断,并调用关闭触发函数。
脚本也有可能被内置的脚本计时器中断。默认的超时限制为 30 秒。这个值可以通过设置 php.ini 的 max_execution_time
或 Apache .conf
设置中对应的"php_value max_execution_time
"参数或者 set_time_limit()
函数来更改。
当计数器超时的时候,脚本将会类似于以上连接中断的情况退出,先前被注册过的关闭触发函数也将在这时被执行。在该关闭触发函数中,可以通过调用 connection_status()
函数来检查超时是否导致关闭触发函数被调用。
如果超时导致了关闭触发函数的调用,该函数将返回 2。
需要注意的一点是 ABORTED
和 TIMEOUT
状态可以同时有效。
这在告诉 PHP 忽略用户的退出操作时是可能的。PHP 将仍然注意用户已经中断了连接但脚本仍然在运行的情况。如果到了运行的时间限制,脚本将被退出,设置过的关闭触发函数也将被执行。在这时会发现函数 connection_status() 返回 3。
2.相关函数:
int ignore_user_abort ( [bool setting] ) This function sets whether a client disconnect should cause a script to be aborted. It will return the previous setting and can be called without an argument to not change the current setting and only return the current setting. int connection_aborted ( void ) Returns TRUE if client disconnected. int connection_status ( void ) Returns the connection status bitfield.
为了定时更新某一文件,需要程序自动运行,从网上搜到了两种方法:ignore_user_abort()
和crontab
ignore_user_abort()
函数搭配set_time_limit(0)
和sleep($interval)
即可实现程序自动运行更新,下面是一个实例
代码如下:
ignore_user_abort(); //即使Client断开(如关掉浏览器),PHP脚本也可以继续执行. set_time_limit(0); // 执行时间为无限制,php默认的执行时间是30秒,通过set_time_limit(0)可以让程序无限制的执行下去 $interval=60*5; // 每隔5分钟运行 do{ $fp = fopen('test.txt','a'); fwrite($fp,'test'); fclose($fp); sleep($interval); // 等待5分钟 }while(true);
只要运行上面的页面,然后关掉,程序就会一直运行下去。
Linux 下有种更简单的方法,就是crontab命令
crontab命令的功能是在一定的时间间隔调度一些命令的执行。
crontab 使用方法: crontab [ -e | -l | -r ] 文件名
PHP에서 사용자 중단을 무시하라는 명령을 받지 않은 경우, Register_shutdown_function()을 통해 종료 트리거 기능을 설정하지 않으면 스크립트가 중단됩니다. 이 닫기 트리거 함수를 통해 원격 사용자가 STOP 버튼을 클릭하고 스크립트가 다시 데이터 출력을 시도하면 PHP는 연결이 중단되었음을 감지하고 닫기 트리거 함수를 호출합니다.
max_execution_time
을 설정하거나 Apache .conf
설정에서 해당 "php_value max_execution_time
" 매개변수를 설정하거나 < code>set_time_limit( ) 함수를 변경합니다.
카운터 타임아웃이 발생하면 위의 연결 중단 상황과 유사하게 스크립트가 종료되며, 이때 이전에 등록한 종료 트리거 함수도 실행됩니다. 종료 트리거 함수에서는 Connection_status()
함수를 호출하여 시간 초과로 인해 종료 트리거 함수가 호출되었는지 확인할 수 있습니다.
한 가지 주의할 점은 ABORTED
및 TIMEOUT
상태가 동시에 유효할 수 있다는 것입니다.
* * * * * Command
특정 파일을 정기적으로 업데이트하려면 프로그램이 자동으로 실행되어야 합니다. 인터넷에서 ignore_user_abort()
두 가지 방법을 찾았습니다. crontab
ignore_user_abort()
함수는 set_time_limit(0)
및 sleep($interval)
과 함께 사용됩니다. 프로그램 업데이트의 자동 실행을 구현하기 위한 예는 다음과 같습니다
코드는 다음과 같습니다.
*/5 * * * * lynx http://www.php.cn
Linux에는 crontab 명령을 사용하는 더 간단한 방법이 있습니다.
crontab 명령의 기능은 특정 시간 간격으로 일부 명령의 실행을 예약하는 것입니다.
crontab 사용법: crontab [ -e | -l | -r ] 파일 이름
-l: 작업 정보 표시
🎜🎜-r: 예약된 실행 작업 정보 삭제 🎜🎜🎜🎜🎜crontab 형식: 🎜🎜
0 8 * * * lynx http://www.php.cn
0 10 6 * 1-5 lynx http://www.php.cn
0 5 7 8 * lynx http://www.php.cn
관련 권장 사항:
php 계획 작업 구현 및 연속 프로세스 예 fsockopen
위 내용은 예약된 작업의 PHP 구현 원리 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!