私はしばらくの間、この問題について調査と実験を行ってきましたが、実行可能な解決策をまだ見つけていません。そのため、助けを求める時が来たと思います。
curl_exec に問題がありますが、特定のサーバーでのみ発生します。まず、いくつかの背景を次に示します。
- CPU: インテル コア I7
- メモリ: 64GB
- OS: 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 =
(それをフォーマットするより良い方法を見つけることができませんでした、申し訳ありません)
また、この同じコンピューターには複数の仮想マシンがあり、それぞれが異なる OS/サーバー/PHP バージョンを持ち、ホスト マシン上にあるまったく同じ物理ドキュメント ルートをすべて持ちます。これらのマシンは、Windows 7/IIS から CentOS/Apache 2.2、およびその他の組み合わせにまで及び、例外なく、この同じスクリプトを問題なく実行し、期待される XML ドキュメントを出力します。URL を Web ブラウザーだけで実行すると、出力は次のようになります。
<?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 のバージョンを変更し、ここSO で見つけた無数の提案を cURL のフリーズに関する他の問題に合わせて試しました。
そして、自分の問題を紹介する本を書いたので、次の質問をしなければなりません。Windows 8 プラットフォームで cURL がハングしないようにするにはどうすればよいでしょうか?