Php 修复Windows 8 apache中的curl_exec挂起
我已经对这个问题进行了一段时间的研究和实验,还没有找到一个可行的解决方案,所以我认为是时候寻求帮助了 我对curl_exec有问题,但仅在特定服务器上。以下是一些背景,首先:Php 修复Windows 8 apache中的curl_exec挂起,php,curl,windows-8,Php,Curl,Windows 8,我已经对这个问题进行了一段时间的研究和实验,还没有找到一个可行的解决方案,所以我认为是时候寻求帮助了 我对curl_exec有问题,但仅在特定服务器上。以下是一些背景,首先: CPU:Intel Core I7 内存:64GB 操作系统:Windows 8.0 服务器:Apache 2.4.4 x86 TS PHP版本:5.5.1 x86 TS w/xDebug 2.2.3 cURL版本:7.30.0 显示问题的PHP代码: $input_vars = (!empty($_POST)) ?
- CPU:Intel Core I7
- 内存:64GB
- 操作系统:Windows 8.0
- 服务器:Apache 2.4.4 x86 TS
- PHP版本:5.5.1 x86 TS w/xDebug 2.2.3
- cURL版本:7.30.0
$input_vars = (!empty($_POST)) ? filter_input_array(INPUT_POST) : array();
$url = 'http://192.168.1.100/geekcavecreations/Morti/chatbot/conversation_start.php';
$qs = '?';
foreach ($input_vars as $key => $value)
{
$qs .= "$key=$value&";
}
$qs= rtrim($qs, '&');
$url .= $qs;
$bot_id = $input_vars['bot_id'];
$options = array(
CURLOPT_USERAGENT => 'Program O XML API',
CURLOPT_RETURNTRANSFER => true,
//CURLOPT_POST => 1,
CURLOPT_MAXREDIRS => 5,
CURLOPT_CONNECTTIMEOUT => 5,
CURLOPT_TIMEOUT => 5,
);
$ch = curl_init($url);
curl_setopt_array($ch, $options);
//curl_setopt($ch, CURLOPT_POSTFIELDS, $input_vars);
$data = curl_exec($ch);
$debug = curl_getinfo($ch);
curl_close($ch);
echo '<pre>Data = ', htmlentities($data), '</pre><br>';
var_dump($debug);
(很抱歉,找不到更好的格式化方法) 同样在这台计算机上还有几个虚拟机,每个虚拟机都有不同的OS/Server/PHP版本,并且都有完全相同的物理文档根,位于主机上。这些机器的范围从Windows 7/IIS到CentOS/Apache 2.2以及其他组合,所有这些机器都毫无例外地运行相同的脚本,并输出预期的XML文档。如果仅在web浏览器中运行URL,则输出如下:
<?xml version="1.0"?>
<program_o>
<version>2.3.0</version>
<status><success>1</success></status>
<bot_id>1</bot_id>
<bot_name>Morti</bot_name>
<user_id>1</user_id>
<user_name>Seeker</user_name>
<chat>
<line>
<input>hello</input>
<response>And a good failed to you, undefined. How are you?</response>
</line>
</chat>
</program_o>
$xml = new SimpleXMLElement('<program_o></program_o>');
$xml->addChild('version', '2.3.0');
$status = $xml->addChild('status');
$status->addChild('success', '1');
$xml->addChild('bot_id', '1');
$xml->addChild('bot_name', 'Morti');
$xml->addChild('user_id', '1');
$xml->addChild('user_name', 'Seeker');
$chat = $xml->addChild('chat');
$line = $chat->addChild('line');
$line->addChild('input', 'hello');
$line->addChild('response', 'And a good failed to you, undefined. How are you?');
$output = $xml->asXML();
header('Content-type: text/xml');
exit($output);
2.3.0
1.
1.
莫蒂
1.
探索者
你好
一个好的失败给了你,没有定义。你好吗?
我还获取了上面的XML输出并将其保存到一个文件中,并让问题脚本对保存的XML文件的URL执行cURL调用,并且该脚本在该点上运行时没有问题,因此我还创建了一个模拟脚本,该脚本只创建了一个SimpleXMLElement对象,填充了一些新标记,然后echo的asXML()创建的对象的输出(本质上是conversation_start.php所做的,但不那么复杂),我也遇到了同样的问题。模型脚本的代码如下所示:
$convo_id = (isset ($request_vars['convo_id'])) ? $request_vars['convo_id'] : get_convo_id();
// do stuff here
function get_convo_id()
{
session_name('Program O XML GUI');
session_start();
$convo_id = session_id();
session_destroy();
return $convo_id;
}
$xml=新的SimpleXMLElement(“”);
$xml->addChild('version','2.3.0');
$status=$xml->addChild('status');
$status->addChild('success','1');
$xml->addChild('bot_id','1');
$xml->addChild('bot_name','Morti');
$xml->addChild('user_id','1');
$xml->addChild('user_name','Seeker');
$chat=$xml->addChild('chat');
$line=$chat->addChild('line');
$line->addChild('input','hello');
$line->addChild('response','和一个好的失败给你,未定义。你好吗?);
$output=$xml->asXML();
标题('Content-type:text/xml');
退出(产出);
我在这里简直不知所措。我已经改变了PHP版本,Apache版本,尝试了无数的建议,这些建议我在这里找到的,还有其他一些关于cURL冻结的问题,比如发现的问题,还有很多其他的问题
现在我已经写了一本书来阐述我的问题,我不得不问:我如何才能让cURL不挂在windows8平台上?嗯,我似乎终于找到了问题的根源。似乎当您对与执行调用的脚本相同的服务器执行cURL调用时,和如果“调用者”和“被调用者”脚本都试图使用相同的会话id,就会发生死锁,导致两个脚本等待另一个脚本释放会话。最后,我添加了一个测试,以查看是否已经有会话id在使用,如果已经有,则调用脚本不会启动会话。如果没有会话id,则调用者启动会话,获取会话id,然后销毁会话,这允许“被调用者”脚本不受限制地访问所述会话,从而消除死锁情况。下面是我用来执行此操作的代码:
使用这种方法,一切都按预期进行。我真诚地希望,这对今后的其他人是有用的
$convo_id = (isset ($request_vars['convo_id'])) ? $request_vars['convo_id'] : get_convo_id();
// do stuff here
function get_convo_id()
{
session_name('Program O XML GUI');
session_start();
$convo_id = session_id();
session_destroy();
return $convo_id;
}