2012-01-20 4 views
0

cURL ничего не возвращает, когда на сервере. Все работает хорошо на локальном хосте, но когда он находится в удаленном хостинге, getSearchResults() ничего не возвращает (или заголовок 302). Это что-то не так с конфигурацией сервера (попробовал 2 разных). Это может быть что-то с CURLOPT_FOLLOWLOCATION? Пробовал и true, и false на localhost - все еще работает. На удаленном хостинге по какой-то причине не разрешается следить за местоположением, но если это работает без локального, я не думаю, что это имеет значение.cURL ничего не возвращает

<?php 
class cURL 
{ 
    private $username; 
    private $password; 
    private static $tmpfname; 

    public function __construct($username,$password) { 
     $this->username = $username; 
     $this->password = $password; 
     $this->makeCookies($username, $password); 
    } 

    private function makeCookies($username, $password) { 
     self::$tmpfname = tempnam("/tmp", "Cookie"); 
     $useragent="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1"; 
     $ch = curl_init(); 
     curl_setopt($ch, CURLOPT_USERAGENT, $useragent); 
     curl_setopt($ch, CURLOPT_COOKIEFILE, self::$tmpfname); 
     curl_setopt($ch, CURLOPT_COOKIEJAR, self::$tmpfname); 
     curl_setopt($ch, CURLOPT_URL,"http://vk.com/login.php"); 
     curl_setopt($ch, CURLOPT_POST, 1); 
     curl_setopt($ch, CURLOPT_POSTFIELDS, "email={$username}&pass={$password}"); 
     ob_start(); 
     curl_exec($ch); 
     ob_end_clean(); 
     curl_close($ch); 
     unset($ch); 
    } 

    private function getHTML($url){ 
     $useragent="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1"; 
     $ch = curl_init(); 
     curl_setopt($ch, CURLOPT_USERAGENT, $useragent); 
     curl_setopt($ch, CURLOPT_COOKIEFILE, self::$tmpfname); 
     curl_setopt($ch, CURLOPT_COOKIEJAR, self::$tmpfname); 
     curl_setopt($ch, CURLOPT_HEADER, true); 
     curl_setopt($ch, CURLOPT_URL,$url); 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
     curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); 
     $contents = curl_exec($ch); 
     curl_close($ch); 

     return $contents; 
    } 

    public function getSearchResults($songname) { 
     $songname = urlencode($songname); 
     $contents = $this->getHTML("http://vk.com/search?c[section]=audio&c[q]={$songname}"); 
     return $contents; 
    } 
} 
?> 
+0

Я никогда не слышал, чтобы определенная опция cURL была отключена на хостинге. Обратитесь к своему хосту или коммутатору. – ceejayoz

+0

@ceejayoz не отключена опция завивки, 'FOLLOWLOCATION' отключается, если PHP работает в безопасном режиме. – Ranty

+1

@heroix Дружелюбное напоминание! Пожалуйста, используйте защищенный, а не частный. Это позволяет проводить расширяемость и модульные тесты позже и считается хорошей практикой. –

ответ

1

302 код редиректа, так что вы должны быть в состоянии использовать CURLOPT_FOLLOWLOCATION, чтобы получить что-нибудь полезное из него.

+0

OP упомянул, что он установил это как true, так и false, но безрезультатно ... –

+2

Кроме того, вместо использования 'ob_start()' и ' ob_end_clean() 'для захвата результатов cURL, рассмотрите возможность установки опции' CURLOPT_RETURNTRANSFER'. Он заставляет 'curl_exec()' возвращать результат как строку, а не выводить его. Если вы хотите подавить вывод, используйте 'CURLOPT_MUTE'. –

+0

@GigaWatt: Хорошая рекомендация, следует поставить это как ответ, чтобы не потеряться в шуме. –

0

Существует множество реализаций механизма переадресации в Интернете для веб-серверов, которые запускают php в безопасном режиме. Например, here (первое, на что вы должны обратить внимание) - это тот, который я однажды изменил для своего собственного скрипта. Он может обрабатывать несколько переадресаций и написан таким образом, что вы можете легко понять и изменить его.

Смежные вопросы