當前位置:首頁 » 編程語言 » php時間等待時間

php時間等待時間

發布時間: 2022-10-09 07:58:08

Ⅰ thinkphp頁面跳轉(success/error)自定義模板怎樣設置跳轉等待時間

thinkphp5.0我是這樣處理的
$this->error('頁面載入失敗,請重新登錄!', Url('Login/login'),'','1');

==》最後一個就是跳轉時間,我定義為1秒。
success也是同樣的道理

Ⅱ PHP 設置代碼的最長執行時間

php完成某些操作的時候,可能需要較長的執行時間。這就需要設置他的執行時間,否則伺服器會在執行時間超時後,停止執行,頁面出現空白的情況。下面推薦兩種解決方案:

  1. php文件頁面設置:

    <?php
    //修改最大執行時間
    ini_set('max_execution_time','0');
    //修改此次最大運行內存
    ini_set('memory_limit','128M');

    /***
    *
    *代碼塊省略......
    *
    *
    */

    ?>
  2. php.ini配置文件設置(具體值,根據需要設置):

    max_execution_time = 60

    memory_limit = 128M

    注意:如果執行內存完全滿足的話,就不需要設置了。具體設置,根據情況靈活設置。

    Ⅲ php執行cmd腳本超時,不能去改ini因為超時期間頁面一直在等待,怎麼才能

    PHP腳本執行超時的解決辦法

    在php中默認腳本執行超時時間為30秒了,如果未進行設置30秒之後如果你的腳本還未執行完就會超時了,下面我來給大詳解解決PHP腳本執行超時的方法。
    php.ini 中預設的最長執行時間是 30 秒,雖然可以通過調整 php.ini 中 max_execution_time的值來達到目的,但有些情況是沒有條件修改php.ini的,如何解決這個問題呢。
    一種方法是在 PHP 腳本中加入
    代碼如下
    ini_set('max_execution_time', '0');
    將運行時間設置成0(無限值);
    另一種方法是在命令行下執行腳本,使用命令行執行腳本時,最大運行時間被設置為了無限值。
    修改php.ini的腳本執行時間限制
    編輯php.ini,修改max_execution_time值:
    代碼如下
    max_execution_time=500
    //此修改需要重新載入php.ini,需要重啟web伺服器生效。
    通過.htaccess 文件設置腳本執行時間
    代碼如下
    php_value max_execution_time 500
    在腳本中設置執行的最大時間
    代碼如下
    ini_set('max_execution_time', 500);
    用php的函數取消腳本的時間限制
    代碼如下
    set_time_limit(0);
    set_time_limit用來設置腳本的超時時間,此函數規定從該句運行時起程序必須在指定秒數內運行結束,超時則程序出錯退出。
    下面是一個例子. 有10000條數據, 要修改其中某些數據, 運用PHP分步執行處理, 代碼如下:
    action.php
    代碼如下
    <?php
    $stid = isset($_GET['stid'])?$_GET['stid']:0;
    $endid = $stid + 100;
    $maxid = 10000;
    function dosomething(){
    //要時間比較多的操作
    ……
    }
    $sql_string=」select * from `table` where id>』$stid』 and id<=』$endid』 order by id」;
    $datas = getdata_bysql($sql_string);
    foreach($datas as $data){
    //處理數據
    …..
    echo $id.」 處理完成. <br />」;
    if($id>=$maxid){exit;}
    }
    if($stid<=$maxid){
    $stid = $stid + 100;
    $url=」action.php?stid=$stid」;
    echo $url;
    echo 『<script language=」javascript」>location=」『.$url.』」; </script>』;
    }
    ?>
    其中的dosomething()是一個耗時操作. 這里我們通過限制id范圍來減少運行時間, 運行完後通過javascript的跳轉來自動運行下一步
    現在dedecms生成html頁面時就是這樣做

    Ⅳ php網站」下載地址「加個等待時間

    隱藏地址沒必要(除非是外鏈別的網站內容)
    簡單的是這樣

    點下載地址 進入下載倒計時頁(可以上廣告了) sleep(3) 自動開始下載

    Ⅳ 幾種常見的PHP超時處理方法

    【Web伺服器超時處理】

    [ Apache ]
    一般在性能很高的情況下,預設所有超時配置都是30秒,但是在上傳文件,或者網路速度很慢的情況下,那麼可能觸發超時操作。
    目前apachefastcgiphp-fpm模式下有三個超時設置:
    fastcgi超時設置:
    修改的fastcgi連接配置,類似如下:

    復制代碼 代碼如下:

    <IfMolemod_fastcgi.c>
    FastCgiExternalServer/home/forum/apache/apache_php/cgi-bin/php-cgi-socket/home/forum/php5/etc/php-fpm.sock
    ScriptAlias/fcgi-bin/"/home/forum/apache/apache_php/cgi-bin/"
    AddHandlerphp-fastcgi.php
    Actionphp-fastcgi/fcgi-bin/php-cgi
    AddTypeapplication/x-
    </IfMole>

    預設配置是30s,如果需要定製自己的配置,需要修改配置,比如修改為100秒:(修改後重啟apache):

    復制代碼 代碼如下:

    <IfMolemod_fastcgi.c>
    FastCgiExternalServer/home/forum/apache/apache_php/cgi-bin/php-cgi-socket/home/forum/php5/etc/php-fpm.sock-idle-timeout100
    ScriptAlias/fcgi-bin/"/home/forum/apache/apache_php/cgi-bin/"
    AddHandlerphp-fastcgi.php
    Actionphp-fastcgi/fcgi-bin/php-cgi
    AddTypeapplication/x-
    </IfMole>

    如果超時會返回500錯誤,斷開跟後端php服務的連接,同時記錄一條apache錯誤日誌:
    [ThuJan2718:30:152011][error][client10.81.41.110]FastCGI:commwithserver"/home/forum/apache/apache_php/cgi-bin/php-cgi"aborted:idletimeout(30sec)
    [ThuJan2718:30:152011][error][client10.81.41.110]FastCGI:incompleteheaders(0bytes)receivedfromserver"/home/forum/apache/apache_php/cgi-bin/php-cgi"
    其他fastcgi配置參數說明:
    復制代碼 代碼如下:

    IdleTimeout發呆時限
    ProcessLifeTime一個進程的最長生命周期,過期之後無條件kill
    MaxProcessCount最大進程個數
    DefaultMinClassProcessCount每個程序啟動的最小進程個數
    DefaultMaxClassProcessCount每個程序啟動的最大進程個數
    IPCConnectTimeout程序響應超時時間
    IPCCommTimeout與程序通訊的最長時間,上面的錯誤有可能就是這個值設置過小造成的
    MaxRequestsPerProcess每個進程最多完成處理個數,達成後自殺

    [ Lighttpd ]
    配置:lig
    Lighttpd配置中,關於超時的參數有如下幾個(篇幅考慮,只寫讀超時,寫超時參數同理):
    主要涉及選項:
    server.max-keep-alive-idle=5
    server.max-read-idle=60
    server.read-timeout=0
    server.max-connection-idle=360
    復制代碼 代碼如下:

    #每次keep-alive的最大請求數,默認值是16
    server.max-keep-alive-requests=100
    #keep-alive的最長等待時間,單位是秒,默認值是5
    server.max-keep-alive-idle=1200
    #lighttpd的work子進程數,默認值是0,單進程運行
    server.max-worker=2
    #限制用戶在發送請求的過程中,最大的中間停頓時間(單位是秒),
    #如果用戶在發送請求的過程中(沒發完請求),中間停頓的時間太長,lighttpd會主動斷開連接
    #默認值是60(秒)
    server.max-read-idle=1200
    #限制用戶在接收應答的過程中,最大的中間停頓時間(單位是秒),
    #如果用戶在接收應答的過程中(沒接完),中間停頓的時間太長,lighttpd會主動斷開連接
    #默認值是360(秒)
    server.max-write-idle=12000
    #讀客戶端請求的超時限制,單位是秒,配為0表示不作限制
    #設置小於max-read-idle時,read-timeout生效
    server.read-timeout=0
    #寫應答頁面給客戶端的超時限制,單位是秒,配為0表示不作限制
    #設置小於max-write-idle時,write-timeout生效
    server.write-timeout=0
    #請求的處理時間上限,如果用了mod_proxy_core,那就是和後端的交互時間限制,單位是秒
    server.max-connection-idle=1200

    說明:
    對於一個keep-alive連接上的連續請求,發送第一個請求內容的最大間隔由參數max-read-idle決定,從第二個請求起,發送請求內容的最大間隔由參數max-keep-alive-idle決定。請求間的間隔超時也由max-keep-alive-idle決定。發送請求內容的總時間超時由參數read-timeout決定。Lighttpd與後端交互數據的超時由max-connection-idle決定。
    延伸閱讀:

    [ Nginx ]
    配置:nf
    復制代碼 代碼如下:

    http{
    #Fastcgi:(針對後端的fastcgi生效,fastcgi不屬於proxy模式)
    fastcgi_connect_timeout5;#連接超時
    fastcgi_send_timeout10; #寫超時
    fastcgi_read_timeout10;#讀取超時
    #Proxy:(針對proxy/upstreams的生效)
    proxy_connect_timeout15s;#連接超時
    proxy_read_timeout24s;#讀超時
    proxy_send_timeout10s; #寫超時
    }

    說明:
    Nginx 的超時設置倒是非常清晰容易理解,上面超時針對不同工作模式,但是因為超時帶來的問題是非常多的。
    延伸閱讀:
    ml
    ml
    ml

    【PHP本身超時處理】
    [ PHP-fpm ]
    配置:nf
    復制代碼 代碼如下:

    <?xmlversion="1.0"?>
    <configuration>
    //...
    .
    .
    EquivalenttoPHP_FCGI_.fcgi
    Usedwithanypm_style.
    #php-cgi的進程數量
    <valuename="max_children">128</value>
    Thetimeout(inseconds)
    Shouldbeusedwhen'max_execution_time'
    '0s'means'off'
    #php-fpm 請求執行超時時間,0s為永不超時,否則設置一個 Ns 為超時的秒數
    <valuename="request_terminate_timeout">0s</value>
    Thetimeout(inseconds).logfile
    '0s'means'off'
    <valuename="request_slowlog_timeout">0s</value>
    </configuration>

    說明:
    在php.ini中,有一個參數max_execution_time可以設置PHP腳本的最大執行時間,但是,在php-cgi(php-fpm)中,該參數不會起效。真正能夠控制PHP腳本最大執行時:
    <valuename="request_terminate_timeout">0s</value>
    就是說如果是使用mod_php5.so的模式運行max_execution_time是會生效的,但是如果是php-fpm模式中運行時不生效的。
    延伸閱讀:

    [ PHP ]
    配置:php.ini
    選項:
    max_execution_time=30
    或者在代碼里設置:
    ini_set("max_execution_time",30);
    set_time_limit(30);
    說明:
    對當前會話生效,比如設置0一直不超時,但是如果php的safe_mode打開了,這些設置都會不生效。
    效果一樣,但是具體內容需要參考php-fpm部分內容,如果php-fpm中設置了request_terminate_timeout的話,那麼max_execution_time就不生效。
    【後端&介面訪問超時】
    【HTTP訪問】
    一般我們訪問HTTP方式很多,主要是:curl,socket,file_get_contents()等方法。
    如果碰到對方伺服器一直沒有響應的時候,我們就悲劇了,很容易把整個伺服器搞死,所以在訪問http的時候也需要考慮超時的問題。
    [ CURL 訪問HTTP]
    CURL 是我們常用的一種比較靠譜的訪問HTTP協議介面的lib庫,性能高,還有一些並發支持的功能等。
    CURL:
    curl_setopt($ch,opt)可以設置一些超時的設置,主要包括:
    *(重要)CURLOPT_TIMEOUT設置cURL允許執行的最長秒數。
    *(重要)CURLOPT_TIMEOUT_MS設置cURL允許執行的最長毫秒數。(在cURL7.16.2中被加入。從PHP5.2.3起可使用。)
    CURLOPT_CONNECTTIMEOUT在發起連接前等待的時間,如果設置為0,則無限等待。
    CURLOPT_CONNECTTIMEOUT_MS嘗試連接等待的時間,以毫秒為單位。如果設置為0,則無限等待。在cURL7.16.2中被加入。從PHP5.2.3開始可用。
    CURLOPT_DNS_CACHE_TIMEOUT設置在內存中保存DNS信息的時間,默認為120秒。
    curl普通秒級超時:
    $ch=curl_init();
    curl_setopt($ch,CURLOPT_URL,$url);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
    curl_setopt($ch,CURLOPT_TIMEOUT,60);//只需要設置一個秒的數量就可以
    curl_setopt($ch,CURLOPT_HTTPHEADER,$headers);
    curl_setopt($ch,CURLOPT_USERAGENT,$defined_vars['HTTP_USER_AGENT']);
    curl普通秒級超時使用:
    curl_setopt($ch,CURLOPT_TIMEOUT,60);
    curl如果需要進行毫秒超時,需要增加:
    curl_easy_setopt(curl,CURLOPT_NOSIGNAL,1L);
    或者是:
    curl_setopt($ch,CURLOPT_NOSIGNAL,true);是可以支持毫秒級別超時設置的
    curl一個毫秒級超時的例子:
    復制代碼 代碼如下:

    <?php
    if(!isset($_GET['foo'])){
    //Client
    $ch=curl_init('');
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
    curl_setopt($ch,CURLOPT_NOSIGNAL,1);//注意,毫秒超時一定要設置這個
    curl_setopt($ch,CURLOPT_TIMEOUT_MS,200);//超時毫秒,cURL7.16.2中被加入。從PHP5.2.3起可使用
    $data=curl_exec($ch);
    $curl_errno=curl_errno($ch);
    $curl_error=curl_error($ch);
    curl_close($ch);
    if($curl_errno>0){
    echo"cURLError($curl_errno):$curl_errorn";
    }else{
    echo"Datareceived:$datan";
    }
    }else{
    //Server
    sleep(10);
    echo"Done.";
    }
    ?>

    其他一些技巧:
    1. 按照經驗總結是:cURL版本>=libcurl/7.21.0版本,毫秒級超時是一定生效的,切記。
    2. curl_multi的毫秒級超時也有問題。。單次訪問是支持ms級超時的,curl_multi並行調多個會不準
    [流處理方式訪問HTTP]
    除了curl,我們還經常自己使用fsockopen、或者是file操作函數來進行HTTP協議的處理,所以,我們對這塊的超時處理也是必須的。
    一般連接超時可以直接設置,但是流讀取超時需要單獨處理。
    自己寫代碼處理:
    復制代碼 代碼如下:

    $tmCurrent=gettimeofday();
    $intUSGone=($tmCurrent['sec']-$tmStart['sec'])*1000000
    +($tmCurrent['usec']-$tmStart['usec']);
    if($intUSGone>$this->_intReadTimeoutUS){
    returnfalse;
    }

    或者使用內置流處理函數stream_set_timeout()和stream_get_meta_data()處理:
    復制代碼 代碼如下:

    <?php
    //Timeoutinseconds
    $timeout=5;
    $fp=fsockopen("",80,$errno,$errstr,$timeout);
    if($fp){
    fwrite($fp,"GET/HTTP/1.0rn");
    fwrite($fp,"Host:rn");
    fwrite($fp,"Connection:Closernrn");
    stream_set_blocking($fp,true);//重要,設置為非阻塞模式
    stream_set_timeout($fp,$timeout);//設置超時
    $info=stream_get_meta_data($fp);
    while((!feof($fp))&&(!$info['timed_out'])){
    $data.=fgets($fp,4096);
    $info=stream_get_meta_data($fp);
    ob_flush;
    flush();
    }
    if($info['timed_out']){
    echo"ConnectionTimedOut!";
    }else{
    echo$data;
    }
    }

    file_get_contents超時:
    復制代碼 代碼如下:

    <?php
    $timeout=array(
    'http'=>array(
    'timeout'=>5//設置一個超時時間,單位為秒
    )
    );
    $ctx=stream_context_create($timeout);
    $text=file_get_contents("",0,$ctx);
    ?>

    fopen超時:
    復制代碼 代碼如下:

    <?php
    $timeout=array(
    'http'=>array(
    'timeout'=>5//設置一個超時時間,單位為秒
    )
    );
    $ctx=stream_context_create($timeout);
    if($fp=fopen("","r",false,$ctx)){
    while($c=fread($fp,8192)){
    echo$c;
    }
    fclose($fp);
    }
    ?>

    【MySQL】
    php中的mysql客戶端都沒有設置超時的選項,mysqli和mysql都沒有,但是libmysql是提供超時選項的,只是我們在php中隱藏了而已。
    那麼如何在PHP中使用這個操作捏,就需要我們自己定義一些MySQL操作常量,主要涉及的常量有:
    MYSQL_OPT_READ_TIMEOUT=11;
    MYSQL_OPT_WRITE_TIMEOUT=12;
    這兩個,定義以後,可以使用options設置相應的值。
    不過有個注意點,mysql內部實現:
    1.超時設置單位為秒,最少配置1秒
    2.但mysql底層的read會重試兩次,所以實際會是3秒
    重試兩次+自身一次=3倍超時時間,那麼就是說最少超時時間是3秒,不會低於這個值,對於大部分應用來說可以接受,但是對於小部分應用需要優化。
    查看一個設置訪問mysql超時的php實例:
    復制代碼 代碼如下:

    <?php
    //自己定義讀寫超時常量
    if(!defined('MYSQL_OPT_READ_TIMEOUT')){
    define('MYSQL_OPT_READ_TIMEOUT',11);
    }
    if(!defined('MYSQL_OPT_WRITE_TIMEOUT')){
    define('MYSQL_OPT_WRITE_TIMEOUT',12);
    }
    //設置超時
    $mysqli=mysqli_init();
    $mysqli->options(MYSQL_OPT_READ_TIMEOUT,3);
    $mysqli->options(MYSQL_OPT_WRITE_TIMEOUT,1);
    //連接資料庫
    $mysqli->real_connect("localhost","root","root","test");
    if(mysqli_connect_errno()){
    printf("Connectfailed:%s/n",mysqli_connect_error());
    exit();
    }
    //執行查詢sleep1秒不超時
    printf("Hostinformation:%s/n",$mysqli->host_info);
    if(!($res=$mysqli->query('selectsleep(1)'))){
    echo"query1error:".$mysqli->error."/n";
    }else{
    echo"Query1:querysuccess/n";
    }
    //執行查詢sleep9秒會超時
    if(!($res=$mysqli->query('selectsleep(9)'))){
    echo"query2error:".$mysqli->error."/n";
    }else{
    echo"Query2:querysuccess/n";
    }
    $mysqli->close();
    echo"closemysqlconnection/n";
    ?>

    延伸閱讀:

    【Memcached】
    [PHP擴展]
    php_memcache客戶端:
    連接超時:boolMemcache::connect(string$host[,int$port[,int$timeout]])
    在get和set的時候,都沒有明確的超時設置參數。
    libmemcached客戶端:在php介面沒有明顯的超時參數。
    說明:所以說,在PHP中訪問Memcached是存在很多問題的,需要自己hack部分操作,或者是參考網上補丁。
    [C&C++訪問Memcached]
    客戶端:libmemcached客戶端
    說明:memcache超時配置可以配置小點,比如5,10個毫秒已經夠用了,超過這個時間還不如從資料庫查詢。
    下面是一個連接和讀取set數據的超時的C++示例:
    復制代碼 代碼如下:

    //創建連接超時(連接到Memcached)
    memcached_st*MemCacheProxy::_create_handle()
    {
    memcached_st*mmc=NULL;
    memcached_return_tprc;
    if(_mpool!=NULL){//getfrompool
    mmc=memcached_pool_pop(_mpool,false,&prc);
    if(mmc==NULL){
    __LOG_WARNING__("MemCacheProxy","gethandlefrompoolerror[%d]",(int)prc);
    }
    returnmmc;
    }
    memcached_st*handle=memcached_create(NULL);
    if(handle==NULL){
    __LOG_WARNING__("MemCacheProxy","create_handleerror");
    returnNULL;
    }
    //設置連接/讀取超時
    memcached_behavior_set(handle,MEMCACHED_BEHAVIOR_HASH,MEMCACHED_HASH_DEFAULT);
    memcached_behavior_set(handle,MEMCACHED_BEHAVIOR_NO_BLOCK,_noblock);//參數MEMCACHED_BEHAVIOR_NO_BLOCK為1使超時配置生效,不設置超時會不生效,關鍵時候會悲劇的,容易引起雪崩
    memcached_behavior_set(handle,MEMCACHED_BEHAVIOR_CONNECT_TIMEOUT,_connect_timeout);//連接超時
    memcached_behavior_set(handle,MEMCACHED_BEHAVIOR_RCV_TIMEOUT,_read_timeout);//讀超時
    memcached_behavior_set(handle,MEMCACHED_BEHAVIOR_SND_TIMEOUT,_send_timeout);//寫超時
    memcached_behavior_set(handle,MEMCACHED_BEHAVIOR_POLL_TIMEOUT,_poll_timeout);
    //設置一致hash
    //memcached_behavior_set_distribution(handle,MEMCACHED_DISTRIBUTION_CONSISTENT);
    memcached_behavior_set(handle,MEMCACHED_BEHAVIOR_DISTRIBUTION,MEMCACHED_DISTRIBUTION_CONSISTENT);
    memcached_returnrc;
    for(uinti=0;i<_server_count;i++){
    rc=memcached_server_add(handle,_ips[i],_ports[i]);
    if(MEMCACHED_SUCCESS!=rc){
    __LOG_WARNING__("MemCacheProxy","addserver[%s:%d]failed.",_ips[i],_ports[i]);
    }
    }
    _mpool=memcached_pool_create(handle,_min_connect,_max_connect);
    if(_mpool==NULL){
    __LOG_WARNING__("MemCacheProxy","create_poolerror");
    returnNULL;
    }
    mmc=memcached_pool_pop(_mpool,false,&prc);
    if(mmc==NULL){
    __LOG_WARNING__("MyMemCacheProxy","gethandlefrompoolerror[%d]",(int)prc);
    }
    //__LOG_DEBUG__("MemCacheProxy","gethandle[%p]",handle);
    returnmmc;
    }
    //設置一個key超時(set一個數據到memcached)
    boolMemCacheProxy::_add(memcached_st*handle,unsignedint*key,constchar*value,intlen,unsignedinttimeout)
    {
    memcached_returnrc;
    chartmp[1024];
    snprintf(tmp,sizeof(tmp),"%u#%u",key[0],key[1]);
    //有個timeout值
    rc=memcached_set(handle,tmp,strlen(tmp),(char*)value,len,timeout,0);
    if(MEMCACHED_SUCCESS!=rc){
    returnfalse;
    }
    returntrue;
    }

    //Memcache讀取數據超時(沒有設置)
    libmemcahed源碼中介面定義:
    LIBMEMCACHED_APIchar*memcached_get(memcached_st*ptr,constchar*key,size_tkey_length,size_t*value_length,uint32_t*flags,memcached_return_t*error);
    LIBMEMCACHED_APImemcached_return_tmemcached_mget(memcached_st*ptr,constchar*const*keys,constsize_t*key_length,size_tnumber_of_keys);
    從介面中可以看出在讀取數據的時候,是沒有超時設置的。
    延伸閱讀:

    【如何實現超時】
    程序中需要有超時這種功能,比如你單獨訪問一個後端Socket模塊,Socket模塊不屬於我們上面描述的任何一種的時候,它的協議也是私有的,那麼這個時候可能需要自己去實現一些超時處理策略,這個時候就需要一些處理代碼了。
    [PHP中超時實現]
    一、初級:最簡單的超時實現 (秒級超時)
    思路很簡單:鏈接一個後端,然後設置為非阻塞模式,如果沒有連接上就一直循環,判斷當前時間和超時時間之間的差異。
    phpsocket中實現原始的超時:(每次循環都當前時間去減,性能會很差,cpu佔用會較高)
    復制代碼 代碼如下:

    <?
    $host="127.0.0.1";
    $port="80";
    $timeout=15;//timeoutinseconds
    $socket=socket_create(AF_INET,SOCK_STREAM,SOL_TCP)
    ordie("Unabletocreatesocketn");
    socket_set_nonblock($socket) //務必設置為阻塞模式
    ordie("Unabletosetnonblockonsocketn");
    $time=time();
    //循環的時候每次都減去相應值
    while(!@socket_connect($socket,$host,$port))//如果沒有連接上就一直死循環
    {
    $err=socket_last_error($socket);
    if($err==115||$err==114)
    {
    if((time()-$time)>=$timeout)//每次都需要去判斷一下是否超時了
    {
    socket_close($socket);
    die("Connectiontimedout.n");
    }
    sleep(1);
    continue;
    }
    die(socket_strerror($err)."n");
    }
    socket_set_block($this->socket)//還原阻塞模式
    ordie("Unabletosetblockonsocketn");
    ?>

    二、升級:使用PHP自帶非同步IO去實現(毫秒級超時)
    說明:
    非同步IO:非同步IO的概念和同步IO相對。當一個非同步過程調用發出後,調用者不能立刻得到結果。實際處理這個調用的部件在完成後,通過狀態、通知和回調來通知調用者。非同步IO將比特分成小組進行傳送,小組可以是8位的1個字元或更長。發送方可以在任何時刻發送這些比特組,而接收方從不知道它們會在什麼時候到達。
    多路復用:復用模型是對多個IO操作進行檢測,返回可操作集合,這樣就可以對其進行操作了。這樣就避免了阻塞IO不能隨時處理各個IO和非阻塞佔用系統資源的確定。
    使用socket_select()實現超時
    socket_select(...,floor($timeout),ceil($timeout*1000000));
    select的特點:能夠設置到微秒級別的超時!
    使用socket_select()的超時代碼(需要了解一些非同步IO編程的知識去理解)
    復制代碼 代碼如下:

    編程 調用類 編程#
    <?php
    $server=newServer;
    $client=newClient;
    for(;;){
    foreach($select->can_read(0)as$socket){
    if($socket==$client->socket){
    //NewClientSocket
    $select->add(socket_accept($client->socket));
    }
    else{
    //there'ssomethingtoreadon$socket
    }
    }
    }
    ?>
    編程 非同步多路復用IO & 超時連接處理類 編程
    <?php
    classselect{
    var$sockets;
    functionselect($sockets){
    $this->sockets=array();
    foreach($socketsas$socket){
    $this->add($socket);
    }
    }
    functionadd($add_socket){
    array_push($this->sockets,$add_socket);
    }
    functionremove($remove_socket){
    $sockets=array();
    foreach($this->socketsas$socket){
    if($remove_socket!=$socket)
    $sockets[]=$socket;
    }
    $this->sockets=$sockets;
    }
    functioncan_read($timeout){
    $read=$this->sockets;
    socket_select($read,$write=NULL,$except=NULL,$timeout);
    return$read;
    }
    functioncan_write($timeout){
    $write=$this->sockets;
    socket_select($read=NULL,$write,$except=NULL,$timeout);
    return$write;
    }
    }
    ?>

    [C&C++中超時實現]
    一般在LinuxC/C++中,可以使用:alarm()設置定時器的方式實現秒級超時,或者:select()、poll()、epoll()之類的非同步復用IO實現毫秒級超時。也可以使用二次封裝的非同步io庫(libevent,libev)也能實現。
    一、使用alarm中用信號實現超時 (秒級超時)
    說明:Linux內核connect超時通常為75秒,我們可以設置更小的時間如10秒來提前從connect中返回。這里用使用信號處理機制,調用alarm,超時後產生SIGALRM信號(也可使用select實現)
    用alarym秒級實現connect設置超時代碼示例:
    復制代碼 代碼如下:

    //信號處理函數
    staticvoidconnect_alarm(intsigno)
    {
    debug_printf("SignalHandler");
    return;
    }
    //alarm超時連接實現
    staticvoidconn_alarm()
    {
    Sigfunc*sigfunc;//現有信號處理函數
    sigfunc=signal(SIGALRM,connect_alarm);//建立信號處理函數connect_alarm,(如果有)保存現有的信號處理函數
    inttimeout=5;
    //設置鬧鍾
    if(alarm(timeout)!=0){
    //...鬧鍾已經設置處理
    }
    //進行連接操作
    if(connect(m_Socket,(structsockaddr*)&addr,sizeof(addr))<0){
    if(errno==EINTR){//如果錯誤號設置為EINTR,說明超時中斷了
    debug_printf("Timeout");

    Ⅵ php有時間等待的301重定向

    header("Refresh:5;url=index.php");

    Ⅶ php 判斷 運行 等待 時間

    這樣:
    $start_time=time();
    .....你的語句.....
    $end_time=time();
    你的語句花費的時間秒數是兩個時間之差
    $els_time=$end_time-$start_time;
    if ($els_time<1) echo '失敗';

    Ⅷ php 執行時間超過2秒 就會提示錯誤信息

    <?php
    // 創建一個cURL資源
    $ch = curl_init();

    // 設置URL和相應的選項
    curl_setopt($ch, CURLOPT_URL, "http://www.example.com/");
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT, 2); //2秒超時

    // 抓取URL並把它傳遞給瀏覽器
    curl_exec($ch);

    // 關閉cURL資源,並且釋放系統資源
    curl_close($ch);
    ?>

    Ⅸ php 隊列等待問題。高分懸賞

    php 中是有Thread這個擴展類的 這個就是支持隊列安裝我不說了

    <?php
    classTextThreadextendsThread{
    public$url;
    public$data;
    publicfunction__construct($url){
    $this->url=$url;
    }

    publicfunctionrun(){
    $this->data=curlGet($this->url);
    }
    }

    //獲取信息
    functioncurlGet($url){
    $ch=curl_init();
    curl_setopt($ch,CURLOPT_URL,$url);
    curl_setopt($ch,CURLOPT_HEADER,0);
    curl_setopt($ch,CURLOPT_TIMEOUT,5);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
    $data=curl_exec($ch);
    curl_close($ch);
    return$data;
    }

    //
    functioncreateThread($urlArray){
    $threadDataArray=array();
    foreach($urlArrayas$key=>$val){
    $threadArray[$key]=newTextThread($val);
    $threadArray[$key]->run();
    }
    foreach($threadArrayas$key=>$thread){
    while($thread->isRunning()){
    usleep(100);
    }
    if($thread->join()){
    $threadDataArray[$key]=$thread->data."====".$key."<br/>";
    }
    //var_mp($thread->join());
    }
    return$threadDataArray;
    }

    for($i=0;$i<=100;$i++){
    $url='http://newyibo.com/Index/getThread';
    $urlArray[]=$url;
    }
    $t=microtime(true);
    $data=createThread($urlArray);
    $e=microtime(true);
    var_mp($data);
    echo"多線程:".($e-$t)."<br/>";

    這是我原來研究的的一個例子,僅供參考

    貌似這個還有一個Event擴展類也有關系,這個沒研究過

    Ⅹ php處理大量數據時,運行到一定時間就中斷了,請問如何解決

    php處理數據時會有一個等待時間,就是所說的超時時間,而且如果使用mysql的話,它也有一個超時時間,運行一串代碼時間如果超過配置文件的時間,會被中斷不運行。第一種你可以修改php配置文件timeout的運行時間,第二你可以分批處理大量數據,注意是分批處理,就OK了。

熱點內容
解壓游戲香皂 發布:2024-12-22 16:49:29 瀏覽:352
新預演算法的亮點 發布:2024-12-22 16:36:30 瀏覽:959
linux命令行快捷鍵 發布:2024-12-22 16:33:27 瀏覽:10
淘寶網怎麼上傳寶貝 發布:2024-12-22 16:30:53 瀏覽:753
伺服器gps是什麼意思 發布:2024-12-22 16:10:43 瀏覽:996
iqoo安卓11變聲器在哪裡 發布:2024-12-22 15:46:45 瀏覽:252
ie鎖定初始密碼在哪裡找 發布:2024-12-22 15:44:48 瀏覽:296
linuxtcp窗口 發布:2024-12-22 15:34:24 瀏覽:948
安卓官翻機和原裝有什麼區別 發布:2024-12-22 15:34:24 瀏覽:662
linux掛載的磁碟 發布:2024-12-22 15:34:23 瀏覽:234