2015-09-05 84 views
1

我有一個非常奇怪的問題與一個cURL請求。基本上我有一些代碼用於在Symfony2上包裝遺留的PHP應用程序(http://symfonybricks.com/it/brick/wrap-legacy-php-code-by-a-symfony2-application)。它們是基本的cURL命令,它應該拉出一個網頁並顯示它。然而,我注意到以下幾點:cURL凍結Apache並超時404錯誤

  • 如果我做一個查詢到一個現有的文件,它的正常工作
  • 如果我做一個查詢到一個不存在的文件,嫋嫋時間了(因爲我已經設置了8秒的時間),在那段時間內,它凍結了整個服務器,我無法從任何其他設備訪問我的網站,直到它實際超時。

這裏是我的代碼:

/** 
* @Route("/", defaults={"controller" = "index.php", "controller2" = "", "controller3" = ""}) 
* @Route("/{controller}", defaults={"controller2" = "index.php", "controller3" = ""}) 
* @Route("/{controller}/", defaults={"controller2" = "index.php", "controller3" = ""}) 
* @Route("/{controller}/{controller2}", defaults={"controller3" = ""}) 
* @Route("/{controller}/{controller2}/", defaults={"controller3" = ""}) 
* @Route("/{controller}/{controller2}/{controller3}", defaults={"controller3" = "index.php"}) 
*/ 
public function getLegacyResourceAction($controller, $controller2, $controller3, Request $request) 

{ 


    $path_to_legacy_code = "http://XXX/"; 

    $originalController = $request->getPathInfo(); 

    $originalQueryString = $request->getQueryString(); 

    $url = "{$path_to_legacy_code}{$originalController}?{$originalQueryString}"; 

    //open connection 

    $ch = curl_init(); 

    curl_setopt($ch, CURLOPT_URL, $url); 

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 

    curl_setopt($ch, CURLOPT_HEADER, false); 

    curl_setopt($ch, CURLOPT_VERBOSE, 1); 

    curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); 

    //Timeout 
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 8); 
    curl_setopt($ch, CURLOPT_TIMEOUT, 8); 
    curl_setopt($ch, CURLOPT_MAXREDIRS, 5);  

    $stderr = fopen("{$this->container->getParameter('kernel.root_dir')}/logs/curl.txt", "a"); 
    curl_setopt($ch, CURLOPT_STDERR, $stderr); 


    //echo "Login stuff in ".$this->container->getParameter('kernel.root_dir')."/logs/curl.txt"; 


    curl_setopt($ch, CURLOPT_COOKIESESSION, 0); 

    curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookies.txt'); 

    curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookies.txt'); 

    $result = curl_exec($ch); 


    if (false === $result) { 
     echo curl_error($ch); 
     exit; 
    } 

    curl_close($ch); 
    fclose($stderr); 

    $Response = new Response($result); 


    return $Response; 

下面是我從一個有效的響應獲取日誌:

* About to connect() to www.xxx.com port 80 (#0) 
* Trying 178.32.223.113... 
* connected 
* Connected to www.xxx.com (178.32.223.113) port 80 (#0) 
> GET /web/legacy/index.php HTTP/1.1 
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:40.0) Gecko/20100101 Firefo$ 
Host: www.xxx.com 
Accept: */* 
Cookie: idto=116; PHPSESSID=a159rcjvh0fk6otukqqq9bkrd5 

* additional stuff not fine transfer.c:1037: 0 0 
* HTTP 1.1 or later with persistent connection, pipelining supported 
< HTTP/1.1 200 OK 
< Date: Sat, 05 Sep 2015 04:26:32 GMT 
< Server: Apache/2.2.22 (Debian) 
< X-Powered-By: PHP/5.5.28-1~dotdeb+7.1 
< Expires: Thu, 19 Nov 1981 08:52:00 GMT 
< Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 
< Pragma: no-cache 
< Vary: Accept-Encoding 
< Transfer-Encoding: chunked 
< Content-Type: text/html 
< 
* Connection #0 to host www.xxx.com left intact 
* Closing connection #0 

下面是從一個無效的響應代碼:

* About to connect() to www.xxx.com port 80 (#0) 
* Trying 178.32.223.113... 
* connected 
* Connected to www.xxx.com (178.32.223.113) port 80 (#0) 
> GET /web/legacy/whatever.php HTTP/1.1 
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:40.0) Gecko/20100101 Firefo$ 
Host: www.xxx.com 
Accept: */* 
Cookie: idto=116; PHPSESSID=a159rcjvh0fk6otukqqq9bkrd5 

* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* Operation timed out after 8001 milliseconds with 0 bytes received 
* Closing connection #0 
* About to connect() to www.xxx.com port 80 (#0) 
* Trying 178.32.223.113... 
* connected 
* Connected to www.xxx.com (178.32.223.113) port 80 (#0) 
> GET /web/legacy/legacy/whatever.php HTTP/1.1 
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:40.0) Gecko/20100101 Firefo$ 
Host: www.xxx.com 
Accept: */* 
Cookie: idto=116; PHPSESSID=a159rcjvh0fk6otukqqq9bkrd5 

* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* Operation timed out after 8001 milliseconds with 0 bytes received 
* Closing connection #0 
* About to connect() to www.xxx.com port 80 (#0) 
* Trying 178.32.223.113... 
* connected 
* Connected to www.xxx.com (178.32.223.113) port 80 (#0) 
> GET /web/legacy/legacy/legacy/whatever.php HTTP/1.1 
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:40.0) Gecko/20100101 Firefo$ 
Host: www.xxx.com 
Accept: */* 

所有的波紋管curl_exec($ ch);直到超時才執行,而不是給我一個機會來檢查404錯誤或什麼。我一直在尋找幾天,至今沒有運氣。

非常感謝!

編輯:

好了,所以我通過刪除這一行來解決這個問題:

curl_setopt($ CH,CURLOPT_COOKIEFILE, 'cookie.txt的');

現在它給出了一個適當的404錯誤。我不知道爲什麼它沒有這條線。問題是,沒有這條線,我打破了我的遺留代碼中的一些會話內容!

編輯2:

我已經改變了:

  • curl_setopt($ CH,CURLOPT_COOKIESESSION,0);

  • curl_setopt($ CH,CURLOPT_COOKIESESSION,1);

現在它工作正常,404錯誤和我的會話。我不知道爲什麼。

編輯3:

好了,我的事情我終於明白這是怎麼回事:

  • 在每一個捲曲的請求,把它寫在cookie中。txt文件
  • 如果有人在超時之前查詢404 url​​,它將鎖定cookie.txt文件,這就是爲什麼整個事情似乎都被凍結的原因。

據我所知,最好的解決方案是爲每個用戶生成一個不同的cookie.txt文件,防止文件鎖定。

回答

0

我終於到這條底線,原來我有兩個問題:

  • 無超時配置,所以如果我想嘗試查詢不存在的網頁,它會無限循環。
  • 我對每個人都使用相同的cookie文件,如果有人被困在如前所述的這樣的循環中,它會鎖定cookie文件,阻止其他用戶訪問該網站。