2008-10-31 8 views

Répondre

6

Je ne comprends pas totalement pourquoi cela se produit, mais je l'ai résolu.

Ce bug décrit le même problème que moi. J'ai un script postant à un autre script, tous les deux en utilisant la même session, qui apparemment bloque PHP. Donc, avant de faire tout le script curl post, j'appelle la fonction session_commit, mettant ainsi fin à la session des scripts d'appel, et permettant au script appelé de redémarrer la session.

Whack ...

9

A partir du manuel php

http://php.net/manual/en/function.session-write-close.php

Les données de session sont généralement stockées après votre script terminé sans qu'il soit nécessaire d'appeler session_write_close(), mais que les données de session est verrouillée pour éviter les écritures simultanées, un seul script peut fonctionner sur une session à tout moment. Lorsque vous utilisez des jeux de cadres avec des sessions, vous constaterez que les images sont chargées une à une en raison de ce verrouillage. Vous pouvez réduire le temps nécessaire pour charger toutes les images en terminant la session dès que toutes les modifications apportées aux variables de session sont effectuées.

Donc vous ne pouvez pas avoir 2 scripts utilisent la même session en même temps.

2

J'ai été mordu par cela aussi. Je l'ai corrigé grâce aux informations fournies dans stackoverflow.

J'avais deux pages, les deux avaient "session_start()" en haut et le premier appelait le second avec curl afin que je puisse POST les variables au second script après validation. Le serveur Web était suspendu jusqu'à ce que j'ajoute "session_write_close()".

Exemple de code

suit:

// IMPORTANT (OR ELSE INFINITE LOOP) - close current sessions or the next page will wait FOREVER for a write lock. 
session_write_close(); 

// We can't use GET because we can't display the password in the URL. 
$host = $_SERVER['HTTP_HOST']; 
$uri = rtrim(dirname($_SERVER['PHP_SELF']), '/\\'); 
$url = "http://$host$uri/formPage2.php?"; 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL,$url); //append URL 
curl_setopt($ch, CURLOPT_POST,TRUE);//We are using method POST 
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($_REQUEST, '', "&"));//append parameters  

curl_exec($ch); // results will be outputted to the browser directly 
curl_close($ch); 
exit(); 
Questions connexes