2011-02-24 9 views
0

--- Mise à jour au fond, il est lié à CURLOPT_COOKIE -PHP Curl, mais unix Curl ne pas

Je développe sur ma machine locale (192.168.1.103), et j'ai PHP script qui effectue un appel CURL pour obtenir l'en-tête et le contenu renvoyé par un script distant.

J'ai installé 2 copies du script distant qui doit retourner son contenu:
- Un sur mon ordinateur local, sous le même hôte virtuel. (http://192.168.1.103/test/output_script.php)
- Un sur un serveur distant. (http://site.com/text/outputscript.php)

Le script CURL fonctionne très bien lorsque j'essaie d'obtenir le contenu à partir du serveur distant, mais expire complètement lorsque j'essaie d'obtenir le contenu du serveur local.

Le bavard du PHP CURL est:

* About to connect() to 192.168.1.103 port 80 (#0) 
* Trying 192.168.1.103... * connected 
* Connected to 192.168.1.103 (192.168.1.103) port 80 (#0) 
> GET /app/getContent HTTP/1.1 

Host: 192.168.1.103 

Accept: */* 

Cookie: PHPSESSID=u8spbervheh3tcrv62gcnc2j72 



* Operation timed out after 5001 milliseconds with 0 bytes received 
* Closing connection #0 

Notez que l'URI est réécrit avec le fichier .htaccess suivant (à la fois l'emplacement):

RewriteEngine on 

RewriteBase /cms/client1/public_html 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule .* index.php [L] 

Notez également que j'ai activé le journal de réécriture et la requête comparée pour s'assurer que l'action mod_rewrite était exactement la même dans toutes les situations. (Je suis 100% sûr que ce n'est pas un trouble de réécriture)

Si je tente d'obtenir le fichier en utilisant l'application CURL sous Ubuntu, il fonctionne bien:

$ curl -v --cookie PHPSESSID=u8spbervheh3tcrv62gcnc2j72 http://192.168.1.103/app/getContent 
* About to connect() to 192.168.1.103 port 80 (#0) 
* Trying 192.168.1.103... connected 
* Connected to 192.168.1.103 (192.168.1.103) port 80 (#0) 
> GET /app/getContent HTTP/1.1 
> User-Agent: curl/7.21.0 (i686-pc-linux-gnu) libcurl/7.21.0 OpenSSL/0.9.8o zlib/1.2.3.4 libidn/1.18 
> Host: 192.168.1.103 
> Accept: */* 
> Cookie: PHPSESSID=u8spbervheh3tcrv62gcnc2j72 
> 
< HTTP/1.1 403 Forbidden 
< Date: Thu, 24 Feb 2011 21:40:17 GMT 
< Server: Apache/2.2.16 (Ubuntu) 
< X-Powered-By: PHP/5.3.3-1ubuntu9.3 
< 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 
< Content-Length: 82 
< Content-Type: text/html; charset=UTF-8 
< 
* Connection #0 to host 192.168.1.103 left intact 
* Closing connection #0 
WT_AUTH non défini. (strictement aucune authentification actuellement en session) 

L'erreur 403 et le contenu WT_AUTH est ce que je m'attends à recevoir au lieu du timeout que j'ai avec PHP.
Il est également le même (voulait & correct) résultat que je reçois si l'on utilise la boucle php sur le serveur distant:

* About to connect() to site.com port 80 (#0) 
* Trying 123.123.123.123... * connected 
* Connected to site.com (123.123.123.123) port 80 (#0) 
> GET /app/getContent HTTP/1.1 

Host: site.com 

Accept: */* 

Cookie: PHPSESSID=u8spbervheh3tcrv62gcnc2j72 



< HTTP/1.1 403 Forbidden 

< Date: Thu, 24 Feb 2011 21:45:30 GMT 

< Server: Apache/2.2.16 (Debian) DAV/2 SVN/1.6.12 mod_fcgid/2.3.6 

< 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 

< Content-Length: 28 

< Content-Type: text/html; charset=UTF-8 

< 

* Connection #0 to host site.com left intact 
* Closing connection #0 

Et je vais aussi obtenir la même chose si j'accéder directement 192.168.1.103/app/getContent dans mon navigateur Enfin, je me suis également assuré que le script getContent fonctionnait en mettant des logs dedans. La partie bizarre est que si je démarre la requête à 16:45:00, et que le timeout se produit à 16:45:05, les données enregistrées du script getContent seront datées à 16:45:05. C'est comme si le CURL maintenait une connexion dans l'état "d'ouverture". Et quand la connexion est fermée, le script php est autorisé à démarrer.

Une idée de mon ça ne fonctionne pas localement?

Si vous voulez jeter un oeil sur le code PHP, voici la partie pertinente:

$ressource = curl_init(); 
curl_setopt($ressource, CURLOPT_URL, $destinationUrl); 
curl_setopt($ressource, CURLOPT_VERBOSE, true); 
$handle = fopen(FRAMEWORK_ROOT . DIRECTORY_SEPARATOR . 'log' . DIRECTORY_SEPARATOR . 'curl_debug.txt', 'w'); 
curl_setopt($ressource, CURLOPT_STDERR, $handle); 

// Turn off the server and peer verification (TrustManager Concept). 
curl_setopt($ressource, CURLOPT_SSL_VERIFYPEER, FALSE); 
curl_setopt($ressource, CURLOPT_SSL_VERIFYHOST, FALSE); 
curl_setopt($ressource, CURLOPT_RETURNTRANSFER, TRUE); //retourn content 
curl_setopt($ressource, CURLOPT_HEADER, TRUE); //get HTTP headers 
curl_setopt($ressource, CURLOPT_COOKIE, session_name() . '=' . session_id()); 
curl_setopt($ressource, CURLOPT_TIMEOUT, 5); 


echo "\n<br />" . date('Y/m/d H:i:s'); 
$httpResponse = curl_exec($ressource); 

echo "\n<br />" . date('Y/m/d H:i:s'); 
if(curl_errno($ressource) != 0) 
    throw new Core_Exc_Def(curl_error($ressource)); // WILL THROW AN ERROR ON 192.168.1.103, BUT NOT ON THE REMOTE SITE. 

fait drôle: avant d'ajouter le TIMEOUT, le chargement était infini. Le site local ne répondait pas, même les autres pages. Je avais besoin de redémarrer le serveur apache pour pouvoir accéder à nouveau le site ...

Mise à jour:
Si je commente la ligne:

curl_setopt($ressource, CURLOPT_COOKIE, session_name() . '=' . session_id()); 

Il est « travail » (il cause un autre problème, mais rien lié au timeout). Les deux scripts sont sur le même hôte virtuel et partagent la même session, mais cela ne devrait pas créer de CURL TimeOut?!

Répondre

4

Cela se produit parce que les sessions sont verrouillées pour l'écriture. Lorsque vous essayez de vous connecter avec votre script sur le même serveur avec le même ID session, le deuxième script attend jusqu'à ce que le verrou de session soit libéré.

Vous devez changer le session_id que vous envoyez à la demande:

Change:

curl_setopt($ressource, CURLOPT_COOKIE, session_name() . '=' . session_id()); 

Pour:

curl_setopt($ressource, CURLOPT_COOKIE, session_name() . '=' . md5(session_id() . mktime())); 
+0

curl_setopt (de ressource de $, CURLOPT_COOKIE, session_name() . '='. md5 (session_id(). time())); – TarranJones