Rumah php教程 php手册 php定时计划任务与fsockopen持续进程实例

php定时计划任务与fsockopen持续进程实例

Jun 13, 2016 am 09:34 AM
fsockopen Tugas yang dijadualkan

Web服务器执行一个PHP脚本,有时耗时很长才能返回执行结果,后面的脚本需要等待很长一段时间才能继续执行。
如果想实现只简单触发耗时脚本的执行而不等待执行结果就直接执行下一步操作,可以通过fscokopen函数来实现。

PHP支持socket编程,fscokopen函数返回一个到远程主机连接的句柄,可以像使用fopen返回的句柄一样,对它进行 fwrite、fgets、fread等操作。
使用fsockopen连接到本地服务器,触发脚本执行,然后立即返回,不等待脚本执行完成,即可实现异步 执行PHP的效果。

例子:

复制代码 代码如下:


 
function triggerRequest($url, $post_data = array(), $cookie = array()){ 
  $method = "GET";  //通过POST或者GET传递一些参数给要触发的脚本 
  $url_array = parse_url($url); //获取URL信息 
  $port = isset($url_array['port'])? $url_array['port'] : 80;   
  $fp = fsockopen($url_array['host'], $port, $errno, $errstr, 30); 
  if (!$fp) { 
    return FALSE; 
  } 
  $getPath = $url_array['path'] ."?". $url_array['query']; 
  if(!empty($post_data)){ 
    $method = "POST"; 
  } 
  $header = $method . " " . $getPath; 
  $header .= " HTTP/1.1\r\n"; 
  $header .= "Host: ". $url_array['host'] . "\r\n "; //HTTP 1.1 Host域不能省略 
  /*以下头信息域可以省略
  $header .= "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13 \r\n";
  $header .= "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,q=0.5 \r\n";
  $header .= "Accept-Language: en-us,en;q=0.5 ";
  $header .= "Accept-Encoding: gzip,deflate\r\n";
   */ 

  $header .= "Connection:Close\r\n"; 
  if(!empty($cookie)){ 
    $_cookie = strval(NULL); 
    foreach($cookie as $k => $v){ 
$_cookie .= $k."=".$v."; "; 
    } 
    $cookie_str =  "Cookie: " . base64_encode($_cookie) ." \r\n"; //传递Cookie 
    $header .= $cookie_str; 
  } 
  if(!empty($post_data)){ 
    $_post = strval(NULL); 
    foreach($post_data as $k => $v){ 
$_post .= $k."=".$v."&"; 
    } 
    $post_str  = "Content-Type: application/x-www-form-urlencoded\r\n";  
    $post_str .= "Content-Length: ". strlen($_post) ." \r\n"; //POST数据的长度 
    $post_str .= $_post."\r\n\r\n "; //传递POST数据 
    $header .= $post_str; 
  } 
  fwrite($fp, $header); 
  //echo fread($fp, 1024); //服务器返回 
  fclose($fp); 
  return true; 
}  

这样就可以通过fsockopen()函数来触发一个PHP脚本的执行,然后函数就会返回。 接着执行下一步操作了。
现在存在一个问题:当客户端断开连接后,也就是triggerRequest发送请求后,立即关闭了连接,那么可能会引起服务器端正在执行的脚本退出

在 PHP 内部,系统维护着连接状态,其状态有三种可能的情况:

* 0 – NORMAL(正常)
* 1 – ABORTED(异常退出)
* 2 – TIMEOUT(超时)

  当 PHP 脚本正常地运行 NORMAL 状态时,连接为有效。当客户端中断连接时,ABORTED 状态的标记将会被打开。远程客户端连接的中断通常是由用户点击 STOP 按钮导致的。当连接时间超过 PHP 的时限(参阅 set_time_limit() 函数)时,TIMEOUT 状态的标记将被打开。

可以决定脚本是否需要在客户端中断连接时退出。有时候让脚本完整地运行会带来很多方便,即使没有远程浏览器接受脚本的输出。默认的情况是当远程客户端 连接 中断时脚本将会退出。该处理过程可由 php.ini 的 ignore_user_abort 或由 Apache .conf 设置中对应的"php_value ignore_user_abort"以及 ignore_user_abort() 函数来控制。如果没有告诉 PHP忽略用户的中断,脚本将会被中断,除非通过 register_shutdown_function() ,可以让我们设置一个当执行关闭时可以被调用的另一个函数.也就是说当我们的脚本执行完成或意外死掉导致PHP执行即将关闭时,我们的这个函数将会 被调用,当远程用户点击 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。

所以还在要触发的脚本中指明:

复制代码 代码如下:


  ignore_user_abort(TRUE); //如果客户端断开连接,不会引起脚本abort 
  set_time_limit(0); //取消脚本执行延时上限 
或使用:
  register_shutdown_function(callback fuction[, parameters]); //注册脚本退出时执行的函数

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Jadual tugas untuk menentukan titik masa dan melaksanakan tugas sekali sahaja yang bergantung pada perkhidmatan dand Jadual tugas untuk menentukan titik masa dan melaksanakan tugas sekali sahaja yang bergantung pada perkhidmatan dand Mar 11, 2024 am 09:07 AM

Tugasan berjadual dijadualkan untuk melaksanakan atat pada titik masa yang ditentukan pada satu masa, dan tugasan sekali bergantung pada perkhidmatan atd Ia perlu dimulakan untuk merealisasikan pada giliran disimpan dalam /var/. direktori spool/at -V: Paparkan maklumat versi -l: Senaraikan baris gilir yang ditentukan Pekerjaan yang menunggu untuk dijalankan bersamaan dengan atq-d: padam tugas yang ditetapkan bersamaan dengan atrm-c: lihat tugasan kerja tertentu [root@localhost~] #systemctlstartatd[root@localhost~]#systemctlenableatd[root@localhost~]# atnow+1minat>useraddxwzat>#

Apakah kaedah untuk menetapkan kuasa berjadual hidup dan mati Windows 7? Apakah kaedah untuk menetapkan kuasa berjadual hidup dan mati Windows 7? Jul 10, 2023 pm 09:49 PM

Kebanyakan pengguna tidak tahu apakah kaedah tetapan hidup dan mati yang dijadualkan untuk windows 7 Secara khusus, win7 boleh menetapkan penutupan automatik, tetapi pengguna tidak tahu bagaimana untuk menyediakannya memasukkan kod mudah, dan anda perlu menggunakan cmd untuk menyediakannya Berikut adalah pengenalan kepada kaedah tetapan hidup dan matikan pemasa Windows 7 yang sebenarnya. Pengguna boleh merujuknya dan menyediakannya, yang sangat mudah. Apakah kaedah untuk menghidupkan dan mematikan pemasa Windows 7 1. Tetapkan penutupan automatik. Malah, ia hanya boleh dilakukan dari dalam keupayaan sistem itu sendiri, iaitu memasukkan arahan penutupan dalam kotak tindakan. Buka bar menu dan klik Tindakan. Jika tidak, hanya tekan kekunci pintasan untuk membukanya, win+r untuk membukanya. 2. Sebagai contoh, jika kita ingin mematikan kuasa selepas tiga jam

Tugas bermasa dan teknologi tugas terancang dalam PHP Tugas bermasa dan teknologi tugas terancang dalam PHP May 11, 2023 pm 04:13 PM

Dengan perkembangan pesat Internet, semakin banyak laman web dan aplikasi perlu melaksanakan beberapa tugas yang dijadualkan dan tugas yang dirancang di latar belakang, seperti pembersihan data, sandaran, analisis statistik, dll. Sebagai bahasa pembangunan web yang popular, PHP juga menyediakan tugas berjadual dan teknologi tugas terancang yang sepadan Artikel ini akan memperkenalkan tugas berjadual dan teknologi tugas terancang dalam PHP secara terperinci. 1. Konsep dan senario penggunaan tugas berjadual 1.1 Konsep Tugas berjadual merujuk kepada melaksanakan secara automatik beberapa tugas atau operasi tertentu dalam titik masa atau selang masa tertentu. 1.2 membuat

Perangkak web PHP menggunakan fsockopen untuk melaksanakan permintaan HTTP Perangkak web PHP menggunakan fsockopen untuk melaksanakan permintaan HTTP Jun 17, 2023 am 11:02 AM

Perangkak web ialah alat pengumpulan data automatik yang boleh menangkap data secara automatik pada rangkaian dengan mensimulasikan tingkah laku pengguna dan menyimpan atau menganalisisnya. Sebagai bahasa pembangunan web yang digunakan secara meluas, PHP juga mempunyai banyak alat dan teknologi pembangunan perangkak web. Artikel ini akan memperkenalkan cara menggunakan fungsi fsockopen PHP untuk melaksanakan permintaan HTTP untuk membina sistem perangkak web yang mudah. Fungsi fsockopen ialah PHP yang berkaitan dengan komunikasi Soket

Tugas bermasa dan pengurusan tugas yang dirancang dengan PHP dan program mini Tugas bermasa dan pengurusan tugas yang dirancang dengan PHP dan program mini Jul 04, 2023 am 10:05 AM

Tugasan pemasaan dan pengurusan tugas terancang PHP dan program mini Dengan perkembangan teknologi Internet yang berterusan, banyak tapak web dan aplikasi perlu melaksanakan tugas tertentu dengan kerap, seperti pembersihan data, analisis data, penyegerakan data, dsb. Dalam PHP dan pembangunan program kecil, cara mengurus tugas berjadual dan tugas yang dirancang adalah topik penting. Artikel ini akan memperkenalkan cara menggunakan PHP dan applet untuk mengurus tugasan yang dijadualkan dan tugasan yang dirancang, serta memberikan contoh kod yang sepadan. Pengurusan tugas berjadual dalam PHP Dalam PHP, kita boleh menggunakan Cron untuk mengurus tugas berjadual.

Pembangunan Laravel: Bagaimana untuk menjadualkan tugas menggunakan Penjadualan Tugas Laravel? Pembangunan Laravel: Bagaimana untuk menjadualkan tugas menggunakan Penjadualan Tugas Laravel? Jun 13, 2023 pm 02:23 PM

Laravel ialah rangka kerja PHP popular yang menyediakan sokongan hebat untuk pembangunan aplikasi web. Salah satu ciri yang berkuasa dan berguna ialah LaravelTaskScheduling. Artikel ini akan memperkenalkan cara menggunakan LaravelTaskScheduling untuk melaksanakan tugas yang dijadualkan. 1. Apakah tugas berjadual LaravelTaskScheduling? LaravelTaskScheduling ialah

Bagaimana untuk melaksanakan tugas bermasa dan tugas yang dirancang melalui rangka kerja Webman? Bagaimana untuk melaksanakan tugas bermasa dan tugas yang dirancang melalui rangka kerja Webman? Jul 08, 2023 am 11:43 AM

Bagaimana untuk melaksanakan tugas bermasa dan tugasan yang dirancang melalui rangka kerja Webman? Webman ialah rangka kerja web ringan yang dibangunkan berdasarkan bahasa Go. Ia menyediakan cara mudah untuk melaksanakan tugas berjadual dan tugasan yang dirancang. Artikel ini akan memperkenalkan cara menggunakan rangka kerja Webman untuk melaksanakan tugas bermasa dan tugas berjadual serta menyediakan contoh kod yang sepadan. Sebelum menggunakan rangka kerja Webman, anda perlu memasang Webman terlebih dahulu. Webman boleh dipasang dengan arahan berikut: gogetgithub.com/he

Bagaimana untuk menyediakan tugas berjadual komputer dalam sistem Win7 Bagaimana untuk menyediakan tugas berjadual komputer dalam sistem Win7 Jul 10, 2023 pm 01:41 PM

Kita sering melihat perkataan yang memulakan projek. Sebenarnya, ini adalah tetapan tugas berjadual dalam komputer kami. Apabila komputer kami dimulakan, tugas berjadual ini akan bermula dengan sistem Win7. Sesetengah tugas mungkin perlu dimulakan, tetapi yang lain tidak. Dalam hal ini, kami boleh menyediakan tugasan yang dijadualkan ini. Mari lihat operasi terperinci. 1. Pertama, kita boleh mencari bar menu mula pada komputer. Dalam menu Mula, kita boleh melihat pilihan yang berkaitan, cari pilihan Panel Kawalan dan klik untuk masuk. 2. Selepas memasuki panel kawalan komputer, kita boleh melihat pilihan sistem dan keselamatan Pada baris pertama halaman semasa, klik butang dan bukanya. 3. Selepas memasukkan sistem dan pilihan keselamatan panel kawalan komputer, kita boleh mencari butang alat pentadbiran di bahagian bawah.

See all articles