要讓程序按計劃自動執(zhí)行,如果是自己的服務(wù)器,那當(dāng)然推薦使用操作系統(tǒng)本身的計劃任務(wù)(例如linux下的cron),這樣不占用資源。但如果使用的是虛擬主機(jī)沒有服務(wù)器的權(quán)限,那我們還可以使用php的計劃任務(wù),總結(jié)一下有以下幾種方式。
1.使用ignore_user_abort函數(shù),如果使用代碼ignore_user_abort(true),表示可以或略用戶終止請求,如果用戶執(zhí)行某個腳本后停止請求(比如關(guān)掉瀏覽器),則腳本還會繼續(xù)執(zhí)行直到執(zhí)行完畢,我們可以利用這一點讓程序無限執(zhí)行下去。例如:
<?phpignore_user_abort(true); //忽略用戶終止請求set_time_limit(0); //不顯示腳本執(zhí)行時間//以下做任何操作 不用擔(dān)心時間問題while(true){ file_put_contents('./b.txt',date('s')); sleep(30);}?> 當(dāng)然上面的做法是比較耗資源的,如果要這樣做一定要謹(jǐn)慎,另外這個腳本必須做權(quán)限控制只能讓管理員來執(zhí)行,并且只執(zhí)行一次,不能讓用戶來執(zhí)行到,否則將會發(fā)生多個腳本同時執(zhí)行的情況。 2.使用圖片標(biāo)簽來請求計劃任務(wù),例如在頁面中放入代碼,這樣頁面一執(zhí)行就會發(fā)起對cron.php的請求,一些開源產(chǎn)品(例如ECSHOP)就是使用的此方式,我們可以在cron.php中加入時間判斷,符合條件的請求才會執(zhí)行,而不是每次訪問頁面都執(zhí)行。這樣做的弊端是,每次用戶訪問都會執(zhí)行cron.php,并且如果cron.php中的程序沒有執(zhí)行完時頁面會顯示還在加載,給用戶一種頁面沒有完全打開的假象。
3.在頁面執(zhí)行時使用fsockopen來請求cron.php,并且在請求之后關(guān)閉連接,只要我們在cron.php中設(shè)置了ignore_user_abort(true),即使關(guān)閉了連接腳本也會執(zhí)行完畢。這個和第二種方式類似,但好處是如果cron.php執(zhí)行時間較長用戶也不會感覺網(wǎng)頁沒有加載完畢。代碼:
<?php $url = 'http://您的域名/cron.php'; $urlarr = parse_url($url); $http = $urlarr['scheme']; if($http == "https") { $transports = "ssl://"; $urlarr["port"] = "443"; } else { $transports = "tcp://"; $urlarr["port"] = "80"; } $fp = fsockopen($transports . $urlarr['host'],$urlarr['port'],$errno,$errstr,$time_out = 30); if(!$fp) { die("ERROR: $errno - $errstr/n"); } else { fputs($fp, "POST ".$urlarr["path"]." HTTP/1.1/r/n"); fputs($fp, "Host: ".$urlarr["host"]."/r/n"); fputs($fp, "Connection: close/r/n/r/n"); fclose($fp); }?>
新聞熱點
疑難解答