要讓程序按計劃自動執行,如果是自己的服務器,那當然推薦使用操作系統本身的計劃任務(例如linux下的cron),這樣不占用資源。但如果使用的是虛擬主機沒有服務器的權限,那我們還可以使用php的計劃任務,總結一下有以下幾種方式。
1.使用ignore_user_abort函數,如果使用代碼ignore_user_abort(true),表示可以或略用戶終止請求,如果用戶執行某個腳本后停止請求(比如關掉瀏覽器),則腳本還會繼續執行直到執行完畢,我們可以利用這一點讓程序無限執行下去。例如:
<?phpignore_user_abort(true); //忽略用戶終止請求set_time_limit(0); //不顯示腳本執行時間//以下做任何操作 不用擔心時間問題while(true){ file_put_contents('./b.txt',date('s')); sleep(30);}?> 當然上面的做法是比較耗資源的,如果要這樣做一定要謹慎,另外這個腳本必須做權限控制只能讓管理員來執行,并且只執行一次,不能讓用戶來執行到,否則將會發生多個腳本同時執行的情況。 2.使用圖片標簽來請求計劃任務,例如在頁面中放入代碼,這樣頁面一執行就會發起對cron.php的請求,一些開源產品(例如ECSHOP)就是使用的此方式,我們可以在cron.php中加入時間判斷,符合條件的請求才會執行,而不是每次訪問頁面都執行。這樣做的弊端是,每次用戶訪問都會執行cron.php,并且如果cron.php中的程序沒有執行完時頁面會顯示還在加載,給用戶一種頁面沒有完全打開的假象。
3.在頁面執行時使用fsockopen來請求cron.php,并且在請求之后關閉連接,只要我們在cron.php中設置了ignore_user_abort(true),即使關閉了連接腳本也會執行完畢。這個和第二種方式類似,但好處是如果cron.php執行時間較長用戶也不會感覺網頁沒有加載完畢。代碼:
<?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); }?>
新聞熱點
疑難解答
圖片精選