如果你在你的php中有openssl,你應該可以用'ssl://'
或'tls://'
作爲主機名或ip的前綴,並帶有正確的端口號,而php應該處理其餘的。所以簡單地這樣:
fsockopen('ssl://78.141.177.180', 443, $errno, $errstr);
並像往常一樣使用返回的資源。 當我沒有捲曲可用時,我自己使用下面的功能(代碼從php.net comment打撈並稍微按摩)。這樣稱呼它
not_curl_get('login.skype.com/json/validator?new_username=foo', 'ssl://', 443)
函數本身:
function not_curl_get($url, $protocol = '', $port = 80, $options = array()) {
$options = array_merge(array(
'follow_location' => true,
'return_response_part' => 'body',
'referer' => false,
'user_agent' => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; hu; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729)',
'cookie_file' => false,
'request_type' => 'get',
), $options);
global $_NOT_CURL_GET_OLDHEADER;
$url = str_replace("http://","",$url);
if (preg_match("#/#","$url")){
$page = $url;
$url = @explode("/",$url);
$url = $url[0];
$page = str_replace($url,"",$page);
if (!$page || $page == ""){
$page = "/";
}
$ip = gethostbyname($url);
}else{
$ip = gethostbyname($url);
$page = "/";
}
$open = fsockopen($protocol.$ip, $port, $errno, $errstr, 60);
if ($options['request_type'] === 'post'){
$send = "POST $page HTTP/1.0\r\n";
}else{
$send = "GET $page HTTP/1.0\r\n";
}
$send .= "Host: $url\r\n";
if ($options['referer']){
$send .= "Referer: ".$options['referer']."\r\n";
}
if ($options['cookie_file']){
if (@file_exists($options['cookie_file'])){
$cookie = urldecode(@file_get_contents($options['cookie_file']));
if ($cookie){
$send .= "Cookie: $cookie\r\n";
$add = @fopen($options['cookie_file'],'w');
fwrite($add,"");
fclose($add);
}
}
}
$send .= "Accept-Language: en-us, en;q=0.50\r\n";
if ($options['user_agent']){
$send .= "User-Agent: ".$options['user_agent']."\r\n";
}
if ($options['request_type']){
$send .= "Content-Type: application/x-www-form-urlencoded\r\n";
$send .= "Content-Length: " .strlen($options['request_type']) ."\r\n\r\n";
$send .= $options['request_type'];
}else{
$send .= "Connection: Close\r\n\r\n";
}
fputs($open, $send);
$return = '';
while (!feof($open)) {
$return .= fgets($open, 4096);
}
fclose($open);
$return = @explode("\r\n\r\n",$return,2);
$header = $return[0];
if ($options['cookie_file']){
if (preg_match("/Set\-Cookie\: /i","$header")){
$cookie = @explode("Set-Cookie: ",$header,2);
$cookie = $cookie[1];
$cookie = explode("\r",$cookie);
$cookie = $cookie[0];
$cookie = str_replace("path=/","",$cookie[0]);
$add = @fopen($options['cookie_file'],'a');
fwrite($add,$cookie,strlen($read));
fclose($add);
}
}
if ($_NOT_CURL_GET_OLDHEADER){
$header = "$_NOT_CURL_GET_OLDHEADER<br /><br />\n$header";
}
if ($return[1]){
$body = $return[1];
}else{
$body = "";
}
if ($options['return_response_part'] === 'body'){
$return = $body;
}
if ($options['return_response_part'] === 'head'){
$return = $header;
}
if ($options['return_response_part'] === 'all'){
$return = "$header$body";
}
if ($options['follow_location']){
if (preg_match("/Location\:/","$header")){
$url = @explode("Location: ",$header);
$url = $url[1];
$url = @explode("\r",$url);
$url = $url[0];
$_NOT_CURL_GET_OLDHEADER = str_replace("\r\n\r\n","",$header);
$l = "Location:";
$_NOT_CURL_GET_OLDHEADER = str_replace("Location:",$l,$_NOT_CURL_GET_OLDHEADER);
return not_curl_get($url, $protocol, $port, $options);
}else{
return $return;
}
}else{
return $return;
}
}
您好,非常感謝你的努力,卜這種方式不會返回我頁面的內容,它的響應HTTP等所需物品。好吧等我其實需要完全file_get_contents我認爲的功能..你確定這是什麼回報?因爲關於我的主機的可能性再次出現了一些權限問題..順便說一下,這個腳本有一個無限循環問題。 – questioner
我不確定你的環境中發生了什麼,這個函數似乎對我很有用(見[demo](http://codepad.viper-7.com/GPQKF8))。無限循環的唯一可能性應該是當服務器始終發送「位置」標題時,但可以使用選項數組禁用它。 – complex857
我是個好兄弟,非常感謝,我會盡力解決我的主機帳戶上的問題。感謝您的所有努力。 ALl最好.. – questioner