2008-10-31 8 views

Antwort

6

Ich verstehe nicht ganz, warum das passiert, aber ich habe es gelöst.

Diese bug beschreibt das gleiche Problem, das ich habe. Ich habe einen Skript-Beitrag in ein anderes Skript, beide mit der gleichen Sitzung, die offenbar PHP blockiert.

Also, bevor ich das ganze Curl Post-Skript mache, rufe ich die session_commit Funktion auf, so dass die aufrufende Skripts-Sitzung beendet wird und das aufgerufene Skript den Neustart der Sitzung ermöglicht.

Whack ...

9

Von dem PHP-Handbuch

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

Sitzungsdaten in der Regel gespeichert wird, nachdem das Skript ohne die Notwendigkeit beendet zu nennen session_write_close(), aber als Sitzungsdaten gesperrt Um gleichzeitige Schreibvorgänge zu verhindern, kann in einer Sitzung zu jeder Zeit nur ein Skript ausgeführt werden.. Wenn Sie Framesets zusammen mit Sessions verwenden, werden die Frames aufgrund dieser Sperre nacheinander geladen. Sie können die Zeit reduzieren, die zum Laden aller Frames benötigt wird, indem Sie die Sitzung beenden, sobald alle Änderungen an den Sitzungsvariablen vorgenommen wurden.

So können Sie nicht 2 Skripte die gleiche Sitzung zur gleichen Zeit verwenden.

2

Ich wurde auch davon gebissen. Ich reparierte es dank der Informationen in Stackoverflow zur Verfügung gestellt.

hatte ich zwei Seiten, beide hatten „session_start()“ an der Spitze und die erste, die zweite mit curl anrufen, damit ich Variablen mit dem zweiten Skript nach der Validierung POST könnte. Der Webserver hing, bis ich „session_write_close()“ hinzugefügt.

Codebeispiel folgt:

// 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();