-2

私のサイトには、jqueryajax関数を使用して呼び出されるPHPスクリプトがあります。基本的に、ユーザーは私のサイトのボタンを押すと、このPHPスクリプトにajax呼び出しを送信し、次にproc_openを使用してサーバー上のpythonスクリプトを呼び出します。これは、Firefoxでテストするとすべて正常に機能しますが、他のブラウザー(chrome、safari、mobile safari)でテストすると、スクリプトが無限ループになります。また、PHPスクリプトを直接呼び出して(URLをブラウザーに貼り付けて)、jqueryで無限ループが発生するかどうかを確認しましたが、同じ結果が得られました(ffでは正常に実行されますが、他のすべてのブラウザーでは無限ループになります)。私が理解していることから、PHPコードはサーバー側で実行され、出力はクライアントブラウザーに送信されるため、スクリプトがFirefoxでのみ実行されている理由がわかりません。

これが私のphpコードです:

<?php
require('../include/constants.php');
session_start();
if(!isset($_SESSION['logged_in'])||!$_SESSION['logged_in'])
{
    header('location:../login.php');
}
$link = mysql_connect(DB_SERVER,DB_USER,DB_PASSWORD);
mysql_select_db(DB_NAME);
$q = "SELECT `cupiduser`,`cupidpass` FROM `users` WHERE `email`='".$_SESSION['email']."' LIMIT 1;";
$result = mysql_query($q);
$row = mysql_fetch_assoc($result);
$minage = $_GET['min'];
$maxage = $_GET['max'];
$descriptorspec = array(
   0 => array("pipe", "r"),  // stdin is a pipe that the child will read from
   1 => array("pipe", "w"),  // stdout is a pipe that the child will write to
   2 => array("pipe", "w") // stderr is a file to write to
);
$cmd = 'python ~/data/users/demo2.py "'.$row['cupiduser'].'" "'.$row['cupidpass'].'" "'.$minage.'" "'.$maxage.'"';
$proc = proc_open($cmd, $descriptorspec, $pipes);
if(is_resource($proc))
{
    fclose($pipes[0]);
    $count = fread($pipes[1], 512);
    fclose($pipes[1]);
    fclose($pipes[2]);
    $exit = proc_close($proc);
}
echo trim($count);
ob_end_flush();
ob_flush();
flush();
ob_start();
?>

Pythonコードはいくつかの計算を実行しているだけで、最後に次のような数値を返します。

print str(count)
4

2 に答える 2

1

locationヘッダーを送信した後、スクリプトを終了するのを忘れたようです。下記参照。

<?php
require('../include/constants.php');
session_start();
if(!isset($_SESSION['logged_in'])||!$_SESSION['logged_in'])
{
    header('location:../login.php');
    die(); // Exit script
}

注:これがループの根本的な原因である場合とそうでない場合がありますが、コードで対処する必要ある問題です。

スクリプトを手動で終了する必要があるのはなぜですか?

header()呼び出しは、ブラウザに小さな文字列のテキストを送信するだけです。ただし、PHPはとの違いを認識していませんheader('location:...')...関数header('foo:...')に送信されたテキストをheader()ブラウザに送信する必要があることを認識しているだけです。ブラウザはサーバーへの接続をすぐに切断する場合もあれば、切断しない場合もあります。実際にはブラウザ次第です。したがって、呼び出し後にコードが呼び出されないheader('location:...')ようにする場合(接続を維持するためにブラウザーに依存することは信頼できないため、常にそうなるはずです)、die()またはexit()(同じです)を呼び出す必要があります。もの)locationヘッダーを送信した直後。

<?php
header("location: http://www.example.com/");
die();
于 2012-04-15T18:40:07.253 に答える
0

問題はheader()関数の下にあるに違いありません。このコード行なしでスクリプトを実行してみてください。

于 2012-04-15T18:06:22.377 に答える