2017年6月29日 星期四

PHP的file_get_contents 逾時操作

在PHP中file_get_contents蠻常用到的,需要注意的地方大概就是在php.ini裡需要將allow_url_fopen = on,還有就是User Agent偽裝一下

ini_set('user_agent','Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0')

不過最近發現到如果呼叫的url過大,就有一定的機率回500錯誤  Orz...

解決方法:
GET:

  $opts = array(  
     'http'=>array(  
          'method'=>"GET",  
          'timeout'=>600,  
       )  
   );  
  $context = stream_context_create($opts);  
  file_get_contents($target_url, false, $context);

POST:

function Post($url, $post = null)  
{  
    $context = array();  
   
    if (is_array($post)) {  
        ksort($post);  
   
        $context['http'] = array (  
            'timeout'=>600,  
            'method' => 'POST',  
            'content' => http_build_query($post, '', '&'),  
         );  
    }  
   
    return file_get_contents($target_url, false, stream_context_create($context));  
}  
   
$data = array (  
    'name' => 'test',  
    'email' => 'test@gmail.com',  
    'submit' => 'submit',  
 );  
Post('http://www.example.com', $data);  

加上TimeOut時間就能避免了,不過就是等久了些使用者會不耐煩。在JQuery的非同步執行下~等久了有若干機會造成DB的Deadlock狀態(透過呼叫API同步資料再搭配系統操作...)。

PS. 建議使用curl或fsockopen來處理,file_get_contents用起來簡單但是其缺點也是挺無奈地,萬一主機商不給改php.ini 或是資料量大或運算/執行較久的頁面,那Debug起來不方便。



沒有留言: