欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

php異步:在php中使用fsockopen curl實現(xiàn)類似異步處理的功能方法

 更新時間:2016年12月10日 09:22:48   投稿:jingxian  
下面小編就為大家?guī)硪黄猵hp異步:在php中使用fsockopen curl實現(xiàn)類似異步處理的功能方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

PHP從主流來看,是一門面向過程的語言,它的最大缺點就是無法實現(xiàn)多線程管理,其程序的執(zhí)行都是從頭到尾,按照邏輯一路執(zhí)行下來,不可能出現(xiàn)分支,這一點是限制php在主流程序語言中往更高級的語言發(fā)展的原因之一。

在PHP中我們有的時候其實希望在執(zhí)行某項操作的時候,同時去執(zhí)行另外一項操作,舉一個場景:在用戶搶票的時候,你并不希望用戶排隊去連接數(shù)據(jù)庫進行查詢、判斷、插入,完成之后再返回用戶結(jié)果。其實我們并不需要用戶等那么久的時間,用戶提交之后,直接告訴他已經(jīng)搶票成功了就可以了,至于各種操作,交給后臺去處理就好。當(dāng)然,這種情況我們現(xiàn)在都用消息列表來處理,把每一個用戶提交的請求存在一個消息列隊中,告訴用戶已經(jīng)搞定了,用戶愉快的關(guān)掉頁面之后,實際上后臺還在一個一個從消息列隊中取出請求進行操作。我們這篇文章則是通過一種異類的手法,實現(xiàn)操作在后臺運行,無需用戶等待。

首先,我們要創(chuàng)建一個請求入口:

<?php

提交的數(shù)據(jù)

提交給后臺

告訴用戶已經(jīng)搞定了

其次,我們需要一個后臺處理程序,用戶是否在線并不影響它的運行:

<?php

ignore_user_abort(true);
set_time_limit(0);

過來的數(shù)據(jù)
數(shù)據(jù)處理

現(xiàn)在的問題是,在第一段代碼中,如何“提交給后臺”?我們通過一種非阻塞式的請求來實現(xiàn)這個功能。也就是創(chuàng)建一個可以被訪問的url,在這個url運行第二段程序,通過一個請求來請求這個url,從而激活第二段程序自動運行。

接下來我們直接看代碼:

// 遠(yuǎn)程請求(不獲取內(nèi)容)函數(shù)
function _sock($url) {
 $host = parse_url($url,PHP_URL_HOST);
 $port = parse_url($url,PHP_URL_PORT);
 $port = $port ? $port : 80;
 $scheme = parse_url($url,PHP_URL_SCHEME);
 $path = parse_url($url,PHP_URL_PATH);
 $query = parse_url($url,PHP_URL_QUERY);
 if($query) $path .= '?'.$query;
 if($scheme == 'https') {
  $host = 'ssl://'.$host;
 }

 $fp = fsockopen($host,$port,$error_code,$error_msg,1);
 if(!$fp) {
  return array('error_code' => $error_code,'error_msg' => $error_msg);
 }
 else {
  stream_set_blocking($fp,true);//開啟了手冊上說的非阻塞模式
  stream_set_timeout($fp,1);//設(shè)置超時
  $header = "GET $path HTTP/1.1\r\n";
  $header.="Host: $host\r\n";
  $header.="Connection: close\r\n\r\n";//長連接關(guān)閉
  fwrite($fp, $header);
  usleep(1000); // 這一句也是關(guān)鍵,如果沒有這延時,可能在nginx服務(wù)器上就無法執(zhí)行成功
  fclose($fp);
  return array('error_code' => 0);
 }
}

我們創(chuàng)建了一個基于fsockopen的函數(shù),這個函數(shù)中利用fsockopen去訪問url,但是在訪問時,并不要求獲取url顯示的內(nèi)容,而是僅僅發(fā)出訪問請求,請求到達(dá)后馬上關(guān)閉這個訪問。這樣做的好處就是無需再等待被訪問的url是否返回了可靠的信息,節(jié)約了時間,這段代碼的執(zhí)行時間在0.1-0.2秒之間,對于普通訪客而言,幾乎察覺不到。因此,在使用時,僅需要調(diào)用這個函數(shù)和對應(yīng)的url即可。不過,這里并沒有提供數(shù)據(jù)傳輸?shù)牟糠郑绾蝹鬏敂?shù)據(jù),其實只需要在$header中增加post的內(nèi)容即可。

除了fsockopen,curl其實也可以實現(xiàn)這樣的效果,有些主機上并不支持fsockopen,我們就可以使用curl來實現(xiàn)。

function _curl($url) {
 $ch = curl_init();
 curl_setopt($ch,CURLOPT_URL,$url);
 curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
 curl_setopt($ch,CURLOPT_TIMEOUT,1);
 $result = curl_exec($ch);
 curl_close($ch);
 return $result;
}

這段代碼的關(guān)鍵是提供了一個Timeout,僅1秒鐘,也就是說curl發(fā)出請求,無論是否接收到返回的內(nèi)容,1秒鐘之后都會關(guān)閉該訪問,因此這個函數(shù)的執(zhí)行數(shù)據(jù)為1.0-1.1秒之間。但對于用戶來說,如果是一個需要進行數(shù)據(jù)處理的應(yīng)用,1秒中的等待幾乎是被忽略的,如果你希望用一段更簡單和容易被理解的代碼,可以選擇curl來實現(xiàn)。

以上這篇php異步:在php中使用fsockopen curl實現(xiàn)類似異步處理的功能方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論