我想使用自定义端口(而不是 8080)获取 URL 的 html,即 abc.com:1234 但它在实时服务器上显示为空白,但在本地主机上工作正常
我的代码:
<?php ini_set("display_errors",1); error_reporting(E_ALL);
ini_set('allow_url_fopen', true); ini_set('allow_url_include', true); ini_set('allow_url_include', 'on'); ?>
<?php
//getSslPage("http://portquiz.net:8080");
getSslPage("http://portquiz.net:666");
function getSslPage($url) {
$curl_connection = curl_init($url);
//set options ///
curl_setopt($curl_connection, CURLOPT_CONNECTTIMEOUT, 3990);
curl_setopt($curl_connection, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
curl_setopt($curl_connection, CURLOPT_HTTPHEADER, array(
'Content-Type: text/xml',
'Connection: Keep-Alive',
'Keep-Alive: 300' ));
curl_setopt($curl_connection, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl_connection,CURLOPT_SSL_VERIFYHOST,0);
curl_setopt($curl_connection, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl_connection, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($curl_connection, CURLOPT_TIMEOUT, 20); //old value 15
//set data to be posted
//curl_setopt($curl_connection, CURLOPT_POSTFIELDS, $post_string);
//perform our request
$result = curl_exec($curl_connection);
echo "<h1 style=color:blue>Output Result:</h1><br>";
echo htmlentities($result);
echo "<h1 style=color:blue>|Curl Exec Detail:</h1><br>";
//var_dump($result);
echo "<pre>";
print_r(curl_getinfo($curl_connection));
echo "</pre>";
echo curl_errno($curl_connection) . '<br/>';
echo curl_error($curl_connection) . '<br/>';
} exit; ?>
本地主机上的输出:
Output Result:
<html> <head> <title>Outgoing Port Tester</title> <style type="text/css"> body { font-family: sans-serif; font-size: 0.9em; } </style> </head> <body> <h1>Outgoing port tester</h1> This server listens on all TCP ports, allowing you to test any outbound TCP port. <p> You have reached this page on port <b>666</b>.<br/> </p> Your network allows you to use this port. (Assuming that your network is not doing advanced traffic filtering.) <p> Network service: unknown<br/> Your outgoing IP: 39.32.94.166</p> <h2>Test a port using a command</h2> <pre> $ telnet portquiz.net 666 Trying ... Connected to portquiz.net. Escape character is '^]'. </pre> <pre> $ nc -v portquiz.net 666 Connection to portquiz.net 666 port [tcp/daytime] succeeded! </pre> <pre> $ curl portquiz.net:666 Port 666 test successful! Your IP: 39.32.94.166</pre> <pre> $ wget -qO- portquiz.net:666 Port 666 test successful! Your IP: 39.32.94.166</pre> <pre> # For Windows PowerShell users PS C:'> Test-NetConnection -InformationLevel detailed -ComputerName portquiz.net -Port 666</pre> <h2>Test a port using your browser</h2> <p> In your browser address bar: <strong>http://portquiz.net:XXXX</strong> </p> Examples: <br/> <a href="http://portquiz.net:8080">http://portquiz.net:8080</a> <br/> <a href="http://portquiz.net:8">http://portquiz.net:8</a> <br/> <a href="http://portquiz.net:666">http://portquiz.net:666</a> <br/> <p> I got complains that portquiz is not working on port 445. My hosting company OVH is probably blocking this port. Sorry about that. Feel free to contact them. See <a href="http://positon.org/is-ovh-blocking-port-445">my blog post</a> and <a href="https://forum.ovh.com/showthread.php/106901-OVH-bloque-le-port-445-vers-mon-serveur-d%C3%A9di%C3%A9">OVH forum post (french)</a>. </p> <p> Your browser can block network ports normally used for purposes other than Web browsing. In this case you should use the telnet or netcat commands to test the port. </p> <p> Please also note that this server uses some port for real services (22, 25), so testing with your browser on those ports will not work. </p> <p> <i>Contact/feedback:</i><br/> <img src="portquizm.png" /> </p> <p> <i>See also:</i><br/> <ul> <li> <a href="http://en.positon.org/post/An-outgoing-port-tester">Blog post on this topic</a> and <a href="http://positon.org/portquiz-net-how-it-works">How it works</a> </li> <li> <a href="http://www.firebind.com/">Firebind</a>, a commercial tester. <a href="http://www.firebind.com/clients/web/">javascript test</a> </li> <li> <a href="https://github.com/nhooyr/outPorts">outPorts</a>, a tiny program to test a range of ports using portquiz </li> </ul> </p> </body> </html>
|Curl Exec Detail:
Array
(
[url] => http://portquiz.net:666/
[content_type] => text/html
[http_code] => 200
[header_size] => 233
[request_size] => 184
[filetime] => -1
[ssl_verify_result] => 0
[redirect_count] => 0
[total_time] => 0.5
[namelookup_time] => 0
[connect_time] => 0.234
[pretransfer_time] => 0.234
[size_upload] => 0
[size_download] => 2694
[speed_download] => 5388
[speed_upload] => 0
[download_content_length] => 2694
[upload_content_length] => 0
[starttransfer_time] => 0.5
[redirect_time] => 0
[redirect_url] =>
[primary_ip] => 178.33.250.62
[certinfo] => Array
(
)
[primary_port] => 666
[local_ip] => 192.168.1.47
[local_port] => 54754
)
0
实时站点上的输出:(结果显示空白/空)
Output Result:
|Curl Exec Detail:
Array
(
[url] => http://portquiz.net:666/
[content_type] =>
[http_code] => 0
[header_size] => 0
[request_size] => 0
[filetime] => -1
[ssl_verify_result] => 0
[redirect_count] => 0
[total_time] => 19.340628
[namelookup_time] => 0.117558
[connect_time] => 0
[pretransfer_time] => 0
[size_upload] => 0
[size_download] => 0
[speed_download] => 0
[speed_upload] => 0
[download_content_length] => -1
[upload_content_length] => -1
[starttransfer_time] => 0
[redirect_time] => 0
[redirect_url] =>
[primary_ip] =>
[certinfo] => Array
(
)
[primary_port] => 0
[local_ip] =>
[local_port] => 0
)
28
Connection timed out after 20001 milliseconds
请帮助我,我正在从最近 2 天开始工作,但没有成功,谢谢
在您上面发布的示例中,我没有看到curl_exec,所以我添加了它。
这对我有用:
<?php ini_set("display_errors", 1);
error_reporting(E_ALL);
ini_set('allow_url_fopen', true);
ini_set('allow_url_include', true);
ini_set('allow_url_include', 'on');
?>
<?php
//getSslPage("http://portquiz.net:8");
function getSslPage($url) {
$curl_connection = curl_init($url); //set options ///curl_setopt($curl_connection, CURLOPT_CONNECTTIMEOUT, 3990);
curl_setopt($curl_connection, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
curl_setopt($curl_connection, CURLOPT_HTTPHEADER, array(
'Content-Type: text/xml',
'Connection: Keep-Alive',
'Keep-Alive: 300'));
curl_setopt($curl_connection, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl_connection, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($curl_connection, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl_connection, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($curl_connection, CURLOPT_TIMEOUT, 20); //old value 15 //set data to be posted //curl_setopt($curl_connection, CURLOPT_POSTFIELDS, $post_string); //perform our request $result = curl_exec($curl_connection); echo "<h1 style=color:blue>Output Result:</h1><br>"; echo htmlentities($result); echo "<h1 style=color:blue>|Curl Exec Detail:</h1><br>"; //var_dump($result); echo "<pre>";
echo "</pre>";
echo curl_errno($curl_connection) . '<br/>';
echo curl_error($curl_connection) . '<br/>';
print_r(curl_exec($curl_connection));
print_r(curl_getinfo($curl_connection));
}
getSslPage("http://portquiz.net:666");
结果:
</pre>0<br/><br/>
<html>
<head>
<title>Outgoing Port Tester</title>
<style type="text/css">
body {
font-family: sans-serif;
font-size: 0.9em;
}
</style>
</head>
<body>
<h1>Outgoing port tester</h1>
This server listens on all TCP ports, allowing you to test any outbound TCP port.
<p>
You have reached this page on port <b>666</b>.<br/>
</p>
Your network allows you to use this port.
(Assuming that your network is not doing advanced traffic filtering.)
<p>
Network service: unknown<br/>
Your outgoing IP: 131.228.182.254</p>
<h2>Test a port using a command</h2>
<pre>
$ telnet portquiz.net 666
Trying ...
Connected to portquiz.net.
Escape character is '^]'.
</pre>
<pre>
$ nc -v portquiz.net 666
Connection to portquiz.net 666 port [tcp/daytime] succeeded!
</pre>
<pre>
$ curl portquiz.net:666
Port 666 test successful!
Your IP: 131.228.182.254</pre>
<pre>
$ wget -qO- portquiz.net:666
Port 666 test successful!
Your IP: 131.228.182.254</pre>
<pre>
# For Windows PowerShell users
PS C:'> Test-NetConnection -InformationLevel detailed -ComputerName portquiz.net -Port 666</pre>
<h2>Test a port using your browser</h2>
<p>
In your browser address bar: <strong>http://portquiz.net:XXXX</strong>
</p>
Examples: <br/>
<a href="http://portquiz.net:8080">http://portquiz.net:8080</a> <br/>
<a href="http://portquiz.net:8">http://portquiz.net:8</a> <br/>
<a href="http://portquiz.net:666">http://portquiz.net:666</a> <br/>
<p>
I got complains that portquiz is not working on port 445. My hosting company OVH is probably blocking this port. Sorry about that. Feel free to contact them. See <a href="http://positon.org/is-ovh-blocking-port-445">my blog post</a> and <a href="https://forum.ovh.com/showthread.php/106901-OVH-bloque-le-port-445-vers-mon-serveur-d%C3%A9di%C3%A9">OVH forum post (french)</a>.
</p>
<p>
Your browser can block network ports normally used for purposes other than Web browsing. In this case you should use the telnet or netcat commands to test the port.
</p>
<p>
Please also note that this server uses some port for real services (22, 25), so testing with your browser on those ports will not work.
</p>
<p>
<i>Contact/feedback:</i><br/>
<img src="portquizm.png" />
</p>
<p>
<i>See also:</i><br/>
<ul>
<li> <a href="http://en.positon.org/post/An-outgoing-port-tester">Blog post on this topic</a> and <a href="http://positon.org/portquiz-net-how-it-works">How it works</a> </li>
<li> <a href="http://www.firebind.com/">Firebind</a>, a commercial tester. <a href="http://www.firebind.com/clients/web/">javascript test</a> </li>
<li> <a href="https://github.com/nhooyr/outPorts">outPorts</a>, a tiny program to test a range of ports using portquiz </li>
</ul>
</p>
</body>
</html>
Array
(
[url] => http://portquiz.net:666/
[content_type] => text/html
[http_code] => 200
[header_size] => 233
[request_size] => 184
[filetime] => -1
[ssl_verify_result] => 0
[redirect_count] => 0
[total_time] => 0.054183
[namelookup_time] => 0.004118
[connect_time] => 0.024217
[pretransfer_time] => 0.024252
[size_upload] => 0
[size_download] => 2703
[speed_download] => 49886
[speed_upload] => 0
[download_content_length] => 2703
[upload_content_length] => -1
[starttransfer_time] => 0.053941
[redirect_time] => 0
[redirect_url] =>
[primary_ip] => 178.33.250.62
[certinfo] => Array
(
)
[primary_port] => 666
[local_ip] => 10.223.128.174
[local_port] => 36696
)
代码对我来说似乎很好,作为一种解决方法,请尝试更改:
curl_setopt ( $curl_connection, CURLOPT_RETURNTRANSFER, true );
自
curl_setopt ( $curl_connection, CURLOPT_RETURNTRANSFER, 1 );
如 curl-exec PHP 手册页的返回值部分所述:http://php.net/manual/function.curl-exec.php
您应该为重定向启用CURLOPT_FOLLOWLOCATION选项,但如果您的服务器处于safe_mode和/或open_basedir有效,这将是一个问题,这也可能导致 curl 问题。
的重要信息是:
连接在 20001 毫秒后超时
这意味着您的连接未通过该主机。原因可能是防火墙或网络配置错误在两端 - 您的服务器或远程服务器。
我想到的第一件事是低于 666 的端口号 (1024)。在 Unix 系统上,只有特权用户才能侦听这些端口。因此,如果您使用的是普通用户,则可能无法收听。
但是,如果您能够从本地计算机连接到它,则问题可能出在您的服务器上。为了检查它是否配置为将连接传递到任何端口,您可以在终端中尝试以下简单命令:
$ telnet portquiz.net 666
Trying 178.33.250.62...
Connected to portquiz.net.
Escape character is '^]'.
GET /
GET /
HTTP 请求,您需要在收到提示时从键盘输入。如果未收到提示,并且在一段时间后收到超时消息 - 则主机配置为不将连接传递到自定义端口。这通常是共享主机的问题。
在这种情况下,您应该执行以下操作之一:
- 重新配置主机以允许此类连接
- 使用一些标准端口:80、8080、443 等
- 将您的托管服务提供商切换到没有此类限制的提供商。
编辑:您也可以从PHP脚本中进行简单的检查:
$fp = fsockopen("portquiz.net", 666);
var_dump($fp);
如果var_dump
的结果false
或者您执行该页面超时 - 原因是您的主机上不允许连接到随机端口。
请注意,PHP 中的curl_*
函数都是 curl 程序的包装器。
这意味着您可以通过命令行尝试同样的事情。
如果您可以通过SSH或Telnet连接实时服务器,
尝试curl http://portquiz.net:666 -v
,看看真正的问题是什么。
您是否注意到此错误"连接在 20001 毫秒后超时"
在此处增加连接超时时间,添加足够的时间而不是 20
curl_setopt($curl_connection, CURLOPT_TIMEOUT, 20);