使用Ajax 與 img 標(biāo)記
在田東等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站建設(shè)、網(wǎng)站制作 網(wǎng)站設(shè)計制作定制制作,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站制作,成都全網(wǎng)營銷推廣,成都外貿(mào)網(wǎng)站建設(shè)公司,田東網(wǎng)站建設(shè)費(fèi)用合理。
原理,服務(wù)器返回的html中插入Ajax 代碼或 img 標(biāo)記,img的src為需要執(zhí)行的程序。
優(yōu)點(diǎn):實(shí)現(xiàn)簡單,服務(wù)端無需執(zhí)行任何調(diào)用
缺點(diǎn):在執(zhí)行期間,瀏覽器會一直處于loading狀態(tài),因此這種方法并不算真正的異步調(diào)用。
$.get("doRequest.php",?{?name:?"fdipzone"}?);
img?src="doRequest.php?name=fdipzone"
使用popen
使用popen執(zhí)行命令,語法:
優(yōu)點(diǎn):執(zhí)行速度快
缺點(diǎn):
1).只能在本機(jī)執(zhí)行
2).不能傳遞大量參數(shù)
3).訪問量高時會創(chuàng)建很多進(jìn)程
//?popen?—?打開進(jìn)程文件指針??
resource?popen?(?string?$command?,?string?$mode?)
pclose(popen('php?/home/fdipzone/doRequest.php?',?'r'));
使用curl
設(shè)置curl的超時時間 CURLOPT_TIMEOUT 為1 (最小為1),因此客戶端需要等待1秒
?php?
$ch?=?curl_init();?
$curl_opt?=?array(?
CURLOPT_URL,?''
CURLOPT_RETURNTRANSFER,1,?
CURLOPT_TIMEOUT,1?
);?
curl_setopt_array($ch,?$curl_opt);?
curl_exec($ch);?
curl_close($ch);?
?
使用fsockopen
fsockopen是最好的,缺點(diǎn)是需要自己拼接header部分。
?php?
$url?=?'';?
$param?=?array(?
'name'='fdipzone',?
'gender'='male',?
'age'=30?
);?
doRequest($url,?$param);?
function?doRequest($url,?$param=array()){?
$urlinfo?=?parse_url($url);?
$host?=?$urlinfo['host'];?
$path?=?$urlinfo['path'];?
$query?=?isset($param)??http_build_query($param)?:?'';?
$port?=?80;?
$errno?=?0;?
$errstr?=?'';?
$timeout?=?10;?
$fp?=?fsockopen($host,?$port,?$errno,?$errstr,?$timeout);?
$out?=?"POST?".$path."?HTTP/1.1\r\n";?
$out?.=?"host:".$host."\r\n";?
$out?.=?"content-length:".strlen($query)."\r\n";?
$out?.=?"content-type:application/x-www-form-urlencoded\r\n";?
$out?.=?"connection:close\r\n\r\n";?
$out?.=?$query;?
fputs($fp,?$out);?
fclose($fp);?
}?
?
注意:當(dāng)執(zhí)行過程中,客戶端連接斷開或連接超時,都會有可能造成執(zhí)行不完整,因此需要加上
ignore_user_abort(true);?//?忽略客戶端斷開?
set_time_limit(0);????//?設(shè)置執(zhí)行不超時
1、建議你讀寫數(shù)據(jù)和下載圖片分開,各用不同的進(jìn)程完成。
比如說,取數(shù)據(jù)用get-data.php,下載圖片用get-image.php。
2、多進(jìn)程的話,php可以簡單的用pcntl_fork()。這樣可以并發(fā)多個子進(jìn)程。
但是我不建議你用fork,我建議你安裝一個gearman worker。這樣你要并發(fā)幾個,就啟幾個worker,寫代碼簡單,根本不用在代碼里考慮thread啊,process等等。
3、綜上,解決方案這樣:
(1)安裝gearman worker。
(2)寫一個get-data.php,在crontab里設(shè)置它每5分鐘執(zhí)行一次,只負(fù)責(zé)讀數(shù)據(jù),然后把讀回來的數(shù)據(jù)一條一條的扔到 gearman worker的隊(duì)列里;
然后再寫一個處理數(shù)據(jù)的腳本作為worker,例如叫process-data.php,這個腳本常駐內(nèi)存。它作為worker從geraman 隊(duì)列里讀出一條一條的數(shù)據(jù),然后跟你的數(shù)據(jù)庫老數(shù)據(jù)比較,進(jìn)行你的業(yè)務(wù)邏輯。如果你要10個并發(fā),那就啟動10個process-data.php好了。處理完后,如果圖片地址有變動需要下載圖片,就把圖片地址扔到 gearman worker的另一個隊(duì)列里。
(3)再寫一個download-data.php,作為下載圖片的worker,同樣,你啟動10個20個并發(fā)隨便你。這個進(jìn)程也常駐內(nèi)存運(yùn)行,從gearman worker的圖片數(shù)據(jù)隊(duì)列里取數(shù)據(jù)出來,下載圖片
4、常駐進(jìn)程的話,就是在代碼里寫個while(true)死循環(huán),讓它一直運(yùn)行好了。如果怕內(nèi)存泄露啥的,你可以每循環(huán)10萬次退出一下。然后在crontab里設(shè)置,每分鐘檢查一下進(jìn)程有沒有啟動,比如說這樣啟動3個process-data worker進(jìn)程:
* * * * * flock -xn /tmp/process-data.1.lock -c '/usr/bin/php /process-data.php /dev/null 21'
* * * * * flock -xn /tmp/process-data.2.lock -c '/usr/bin/php /process-data.php /dev/null 21'
* * * * * flock -xn /tmp/process-data.3.lock -c '/usr/bin/php /process-data.php /dev/null 21'
不知道你明白了沒有
本篇文章是對php中使用異步調(diào)用獲取數(shù)據(jù)時出現(xiàn)(由于出現(xiàn)錯誤c ce e而導(dǎo)致此項(xiàng)操作無法完成)的解決方法進(jìn)行了詳細(xì)的分析介紹 需要的朋友參考下 ?
【詳細(xì)錯誤】 由于出現(xiàn)錯誤 c ce e 而導(dǎo)致此項(xiàng)操作無法完成
【造成原因】 未指定輸出編碼格式
lishixinzhi/Article/program/PHP/201311/21112
利用php的系統(tǒng)調(diào)用,開啟新的進(jìn)程來實(shí)現(xiàn)。
php
提供了fsockopen函數(shù),此函數(shù)的功能為初始化一個套接字連接到指定主機(jī),默認(rèn)情況下將以阻塞模式開啟套接字連接。當(dāng)然你可以通過stream_set_blocking()將它轉(zhuǎn)換到非阻塞模式。這是關(guān)鍵。所以,思路就是:開啟一個非阻塞的套接字連接到本機(jī),本機(jī)收到之后作一些耗時處理。
首先 php 7以下 不支持異步方式(有個類庫 可以勉強(qiáng)算是支持了異步 名字忘了)
其次 php腳本 由于是逐行解析的,不常駐線程(當(dāng)然可以設(shè)置為永久連接,不自動超時退出) 異步意義不大。
第三 我懷疑你是想問javascript的異步請求? 如何用php處理?
如果沒問錯的話 可以用其他方式來解決異步問題,就是同時發(fā)出多個web request請求 等多個請求成功之后將結(jié)果寫入數(shù)據(jù)庫(文件) 然后 有一個 一直在等待結(jié)果的php請求進(jìn)程 一旦讀取到了這個寫入完畢的(數(shù)據(jù)庫)文件結(jié)果 馬上返回給瀏覽器
頁面1.php里面寫具體的執(zhí)行語句
頁面2.php直接使用curl調(diào)用頁面1.php 并設(shè)置超時時間;根據(jù)你自己的需求寫但是你不一定如果超時時間內(nèi) 數(shù)據(jù)庫沒執(zhí)行玩 那你可能就獲取不到插入結(jié)果了
訪問2.php應(yīng)該就是你說的異步了