gpt4 book ai didi

php - 修复 curl_exec 在 Windows 8 apache 中挂起

转载 作者:行者123 更新时间:2023-12-04 18:09:33 25 4
gpt4 key购买 nike

我已经对这个问题进行了一段时间的研究和试验,但尚未找到可行的解决方案,所以我认为是时候寻求帮助了。

我遇到了 curl_exec 的问题,但仅限于特定的服务器。首先是一些背景:

  • CPU:英特尔酷睿 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)) ? 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);

可以看出,我已经尝试使用 GET 和 POST 进行此操作,并且都给出了相同的结果。上面列出的超时选项在那里,因此脚本不会无限期地运行。在我停止 Apache 服务以停止挂断之前,我已经让它挂了 3 个多小时(只是在浏览器中取消不会这样做)。脚本的输出如下:

array (size=26)
'url' => string 'ht tp://192.168.1.100/geekcavecreations/Morti/chatbot/conversation_start.php?say=hello&bot_id=1&convo_id=78a9s39gut34lurq055in5s6r4&format=xml' (length=141)
'content_type' => null
'http_code' => int 0
'header_size' => int 0
'request_size' => int 203
'filetime' => int -1
'ssl_verify_result' => int 0
'redirect_count' => int 0
'total_time' => float 5
'namelookup_time' => float 0
'connect_time' => float 0
'pretransfer_time' => float 0
'size_upload' => float 0
'size_download' => float 0
'speed_download' => float 0
'speed_upload' => float 0
'download_content_length' => float -1
'upload_content_length' => float 0
'starttransfer_time' => float 0
'redirect_time' => float 0
'redirect_url' => string '' (length=0)
'primary_ip' => string '192.168.1.100' (length=13)
'certinfo' =>
array (size=0)
empty
'primary_port' => int 80
'local_ip' => string '192.168.1.100' (length=13)
'local_port' => int 2546

Data =

(找不到更好的格式化方式,抱歉)

在同一台计算机上还有几个虚拟机,每个都有不同的操作系统/服务器/PHP 版本,并且都具有完全相同的位于主机上的物理文档根目录。这些机器的范围从 Windows 7/IIS 到 CentOS/Apache 2.2,以及其他组合,所有这些机器都毫无异常(exception)地运行相同的脚本,并输出预期的 XML 文档。如果我只在网络浏览器中运行该 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 输出并将其保存到一个文件中,并让问题脚本对保存的 XML 文件的 URL 执行 cURL 调用,此时脚本可以正常工作,所以我还创建了一个模型脚本,它只创建一个 SimpleXMLElement 对象,填充一些新标签,然后回显创建对象的 asXML() 输出(本质上是 conversation_start.php 所做的,但不那么复杂),我得到了同样的问题。模型脚本的代码如下:

$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);

我的智慧几乎到这里就结束了。我已经更改了 PHP 版本、Apache 版本,尝试了我在这里找到的无数建议,以解决 cURL 卡住的其他问题,如发现的那样 here , herehere ,以及其他许多人。

现在我已经写了一本书来介绍我的问题,我不得不问:如何让 cURL 避免在 Windows 8 平台上挂起?

最佳答案

好吧,我似乎终于找到了问题的根源。似乎当您对与执行调用的脚本相同的服务器执行 cURL 调用时,如果“调用者”和“被调用者”脚本都试图使用相同的 session ID , 发生死锁,导致两个脚本等待对方释放 session 。我最后添加了一个测试来查看是否已经有一个 session ID 在使用中,如果是这样,调用脚本不会启动 session 。如果没有session id,则调用者启动一个session,获取session id,然后销毁session,这允许“callee”脚本不受限制地访问所述session,从而消除死锁情况。下面是我用来执行此操作的代码:

$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;
}

使用此方法,一切都按预期工作。我真诚地希望这对将来的其他人有用。

关于php - 修复 curl_exec 在 Windows 8 apache 中挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17750515/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com