我正在尝试使用PHPCrawl (http://sourceforge.net/projects/phpcrawl/)来拖网一个通过HTTPS交付的网站。
我可以看到,在PHPCrawlerHTTPRequest类(openSocket方法)中有对SSL的支持:
// If ssl -> perform Server name indication
if ($this->url_parts["protocol"] == "https://")
{
$context = stream_context_create(array('ssl' => array('SNI_server_name' => $this->url_parts["host"])));
$this->socket = @stream_socket_client($protocol_prefix.$ip_address.":".$this->url_parts["port"], $error_code, $error_str,
$this->socketConnectTimeout, STREAM_CLIENT_CONNECT, $context);
}问题在于对stream_socket_client的调用--尽管它返回的是零error_code,并且没有error_str,但这个->套接字仍然是假的。
该方法的文档声明如下:
如果errno中返回的值为0,而函数返回FALSE,则表示错误发生在connect()调用之前。
(见http://php.net/manual/en/function.stream-socket-client.php)
因此,我尝试使用注释部分中提供的一个示例来修改流上下文,使用'stream_context_set_option‘将verify_host和verify_peer设置为false --这两者似乎都没有任何效果。
我不太精通PHP或网络的错综复杂之处-有人知道:
我应该注意-我正在使用Facebook (HTTPS)作为测试服务器。
发布于 2015-04-07 01:02:19
我发现了问题-
发布于 2018-10-10 10:08:25
旧话题,但我在使用PHPCrawler时遇到了同样的问题。对我起作用的是用户在sourceforge上所写的东西(来源:https://sourceforge.net/p/phpcrawl/bugs/86/#5993)。
您必须做的是将PHPCrawlerHTTPReqeust.class.php中第547行的PHPCrawlerHTTPReqeust.class.php调用重写为以下内容:
$context = stream_context_create(array(
'ssl' => array(
'SNI_server_name' => $this->url_parts["host"],
'verify_peer' => false,
'verify_peer_name' => false,
)
));希望这对将来的人有帮助。
https://stackoverflow.com/questions/29403231
复制相似问题