>  기사  >  백엔드 개발  >  예약된 작업의 PHP 구현 원리 분석

예약된 작업의 PHP 구현 원리 분석

黄舟
黄舟원래의
2017-11-14 09:37:502404검색

많은 사람들이 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(&#39;test.txt&#39;,&#39;a&#39;); 
fwrite($fp,&#39;test&#39;); 
fclose($fp); 
sleep($interval); // 等待5分钟 
}while(true);

只要运行上面的页面,然后关掉,程序就会一直运行下去。

Linux 下有种更简单的方法,就是crontab命令

crontab命令的功能是在一定的时间间隔调度一些命令的执行。

crontab 使用方法: crontab [ -e | -l | -r ] 文件名
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는 사용자의 연결이 끊어졌지만 스크립트는 계속 실행 중임을 계속 알 수 있습니다. 실행 시간 제한에 도달하면 스크립트가 종료되고 설정된 종료 트리거 기능도 실행됩니다. 이 시점에서 연결_상태() 함수가 3을 반환한다는 것을 알 수 있습니다.

2. 관련 기능:


* * * * * 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 ] 파일 이름


-e: 작업 편집

-l: 작업 정보 표시

🎜🎜-r: 예약된 실행 작업 정보 삭제 🎜🎜🎜🎜🎜crontab 형식: 🎜🎜
0 8 * * * lynx http://www.php.cn
🎜시간, 일, 월, 주별로 실행하는 명령🎜🎜🎜crontab 예: 🎜🎜
0 10 6 * 1-5 lynx http://www.php.cn
🎜www를 5분마다 방문하세요. php.cn🎜🎜
0 5 7 8 * lynx http://www.php.cn
🎜www.php.cn🎜🎜rrreee🎜매일 오전 8시에 방문하세요🎜🎜rrreee🎜매월 6일 및 매주 월요일~금요일 오전 10시 www.php.cn🎜🎜rrreee에 방문하세요 🎜www.php.cn 8월 7일 오전 5시🎜🎜🎜🎜위의 몇 가지 특별한 의미: 🎜🎜🎜"*"는 값 범위 내의 모든 숫자를 나타내고, "/"는 모든 의미를 나타내고, "*/5" 5개 단위마다를 의미하고, "-"는 특정 숫자에서 특정 숫자까지를 의미하고, ","는 여러 개의 개별 숫자를 구분한다는 의미입니다. 🎜🎜🎜🎜🎜요약: 🎜🎜🎜🎜이 기사를 통해 많은 친구들이 PHP 예약 작업의 구현 원칙이 무엇인지 알아야 한다고 믿습니다. 🎜

관련 권장 사항:

PHP 계획 작업의 예

php 계획 작업 구현 및 연속 프로세스 예 fsockopen

php 예정된 작업

위 내용은 예약된 작업의 PHP 구현 원리 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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