實現php非同步處理的方法

來源:互聯網
上載者:User
在實際產生環境下,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的非同步。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.