實作php異步處理的方法

小云云
發布: 2023-03-21 20:18:01
原創
2288 人瀏覽過

在實際生成環境下,php作為後台的介面伺服器已經很常見,php當然具有它能作為後台伺服器的優勢之處,但是,在處理一些客戶端並不關心的結果時,就顯出它的弊端了---沒有異步執行的機制。就例如我們想做一些對於某次客戶端訪問php的性能記錄(包括開始時間、結束時間、此次結果狀態等)的紀錄時,客戶端當然想的是php的本次處理能夠早點回复,拿到結果,而如果安裝常規的方案,客戶端就得等php做完效能記錄之後,才能拿到結果。相當於你去銀行去查你現在的餘額,而櫃員跑過去跟其他人鬧了一會兒的磕,在來告訴你的結果一樣。

所以,很多時候,就需要一種php能執行非同步操作。

那要怎麼實現非同步呢?

其中一個方案就是利用php的系統調用,開啟新的程序來實現。

php 提供了fsockopen函數,此函數的功能為初始化一個套接字連接到指定主機,預設會以阻塞模式開啟套接字連線。當然你可以透過stream_set_blocking()將它轉換到非阻塞模式。這是關鍵。所以,想法就是:開啟一個非阻塞的套接字連接到本機,本機收到之後作一些耗時處理。

類似這樣的處理程式碼(檔案posttest.php):

$fp = fsockopen($php_Path,80);
if (!$fp) {
    LMLog::error("fsockopen:err" );
} else {
    $out = "GET /album/action/album_write_friends_thread_record.php?key=&u=   HTTP/1.1\r\n";
    $out .= "Host: ".$php_Path."\r\n";
    $out .= "Connection: Close\r\n\r\n";
    stream_set_blocking($fp,true);
    stream_set_timeout($fp,1);
    fwrite($fp, $out);
    usleep(1000);
    fclose($fp);
}
登入後複製

這裡,usleep(1000) 非常關鍵,它能保證這個請求能發出去。

我們在來看處理的程式碼邏輯(檔案album_write_friends_thread_record.php):

<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2016-09-23
 * Time: 09:26
 */
/**
 * 客户端调用服务器接口页面
 * user: guwen
 */
sleep(20);// 睡眠20s
?>实际上,我们服务器在执行fsockopen 那段程序时,就不会再等20s之后才能返回给客户端,而是发出这个请求之后,即返回客户端,销毁进程,
而把剩余的工作交由其他进程慢慢做去,这就实现了php的异步。
登入後複製

相關推薦:

#PHP非同步處理的實作方案

以上是實作php異步處理的方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!