我的网站上有一个PHP脚本,使用jquery ajax函数调用。基本上用户按下我网站上的按钮,它会向这个PHP脚本发送一个ajax调用,然后使用proc_open调用我服务器上的python脚本。当我在firefox中测试它时,一切正常,但是当我在其他浏览器(chrome,safari,mobile safari)中测试时,脚本无限循环。我也尝试直接调用PHP脚本(通过将url粘贴到浏览器中)来检查它是否在我的jquery中是一个无限循环并得到相同的结果(在ff中运行正常,但在所有其他浏览器中运行无限循环)。据我所知,PHP代码在服务器端执行,然后输出发送到客户端浏览器,所以我无法弄清楚为什么脚本只在firefox中运行。我也尝试过SSH到我的服务器并从命令行运行python脚本,它运行正常,所以我不认为它是python脚本的问题。
继承我的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)
答案 0 :(得分: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();
答案 1 :(得分:0)
我打赌这个问题位于header()函数下面。尝试在没有这行代码的情况下运行脚本。