2012-01-22 5 views
4

Мой Curl скрипт не работает больше (так что имейте в виду, он сделал работу раньше) на моем локальном хосте (так он работает на моем внешнем хосте, следовательно: это может быть настройки сервера):cURL больше не устанавливает cookie, но почему?

Этот скрипт работал отлично до моего локального хоста (он все еще работает на моем хосте). Ничего не изменилось.

  • Возможно, факт, что я запускал этот скрипт более 3000 раз на моем локальном хосте, полезно знать.
  • Я работаю на Windows 7, используя WampServer для установки хоста.
  • Возможно, я изменил настройку, которая влияет на написание файлов cookie. Но какой?

REAL PROBLEM: cURL не устанавливает печенье! Какие модули apache должны быть включены для написания файлов cookie (в .txt-файле)? Я запускаю wampserver.

Пожалуйста, обратите внимание, я уже использую:

curl_setopt($curlTable, CURLOPT_COOKIEJAR, 'cookie.txt'); 
    curl_setopt($curlTable, CURLOPT_COOKIEFILE, 'cookie.txt'); 

И php.ini является:

extension=php_curl.dll is uncommented 
  • Боковой вопрос: ли curl_close незадана печенье? И если параметр cookiejar не установлен?
  • Главный вопрос:. Почему doens't локон написать печенье, как он должен делать (и делает на моем внешнем хосте, а не на моем LOCALHOST

Другая информация:

phpinfo()

curl 
cURL support  enabled 
cURL Information 7.21.7 
Age     3 
Features 
AsynchDNS   Yes 
Debug    No 
GSS-Negotiate  Yes 
IDN     No 
IPv6    Yes 
Largefile   Yes 
NTLM    Yes 
SPNEGO    No 
SSL     Yes 
SSPI    Yes 
krb4    No 
libz    Yes 
CharConv   No 
Protocols   dict, file, ftp, ftps, gopher, 
        http, https, imap, imaps, ldap, pop3, 
        pop3s, rtsp, scp, sftp, smtp, smtps, telnet, tftp 
Host    i386-pc-win32 
SSL Version   OpenSSL/0.9.8r 
ZLib Version  1.2.5 
libSSH Version  libssh2/1.2.7 

В настоящее время с помощью:

preg_match('/name="csrf" value="(.*?)"/', $getTokenCurlData, $token); 

$postFields = array(
    'user'  => $userNum, 
    'paswoord' => $userPass, 
    'login' => 'loginform', 
    'csrf'  => $token[1]); 

// 'user='.$userNum.'&paswoord='.$userPass.'&login=loginform&csrf='.$token[1] 

$postData = http_build_query($postFields); 

    $curlTable = curl_init(); 
    curl_setopt($curlTable, CURLOPT_URL, 'link'); 
    curl_setopt($curlTable, CURLOPT_COOKIEJAR, 'cookie.txt'); 
    curl_setopt($curlTable, CURLOPT_COOKIEFILE, 'cookie.txt'); 
    curl_setopt($curlTable, CURLOPT_ENCODING, 'gzip'); 
    curl_setopt($curlTable, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($curlTable, CURLOPT_POST, true); 
    $tableData = curl_exec($curlTable); 
    if (!$tableData) echo 'post problem?'.$tableData; 
    if ($tableData == false) 
{ 
    echo 'Curl error: ' . curl_error($curlTable); 
} 

    curl_close($curlTable); 
// Here I further process my data. 
+0

/var/log/apache/errors.log, что он говорит? Или если вы заходите в журнал. Включить ошибки отображения в PHP – Layke

+0

Ничего особенного ... Нет ошибок. – SuperSpy

+0

Откуда вы знаете, что это не работает. Какой бит не работает? – Layke

ответ

6

Возможно, вы были заблокированы в процессе входа в систему.Это даст вам больше информации о проблеме:

// change 
// if (!$siteSource) echo 'Help!'; 
// to 
if ($siteSource === false) 
{ 
    echo 'Curl error: ' . curl_error($curl); 
} 

EDIT: некоторые другие неавтоматического, что вы можете попробовать (связанные с SSL решена мои проблемы более, что один раз):

curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.0.3705; .NET CLR 1.1.4322; Media Center PC 4.0)'); 
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); 
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($curl, CURLOPT_VERBOSE, 1); 

// following is very important 
// TRUE to follow any "Location: " header that the server sends 
// as part of the HTTP header (note this is recursive, PHP will follow 
// as many "Location: " headers that it is sent, unless CURLOPT_MAXREDIRS is set). 
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); 

РЕДАКТИРОВАТЬ 2: После выбора вы получите возвращаемые заголовки (используйте только для отладки). Кроме того, убедитесь, что cookie.txt используется правильно (локализуемо и доступно для записи).

curl_setopt($curl, CURLOPT_HEADER, true); 

Это все, что я могу внести с моей стороны. А теперь обед!


EDIT 3: Cookie, связанные вещи:

$cookie_file = PATH_TO_YOUR_COOKIE_FILE . '/cookie.txt'; 

if (! file_exists($cookie_file) || ! is_writable($cookie_file)) 
{ 
    echo 'Cookie file missing or not writable.'; 
    exit; 
} 

// you already added the following, I put it again just to remark their utility 
curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie_file); 
curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie_file); 

EDIT 4: Всегда проверяйте это в начале:

if (! extension_loaded('curl')) 
{ 
    echo "You need to load/activate the curl extension."; 
} 

Если вы получаете эту ошибку, активировать завиток в php.ini раскопание/снятие передней части ;

windows: 
;extension=php_curl.dll // or curl.dll 
linux: 
;extension=php_curl.so // or curl.so 

и перезапустить веб-сервер. Если вы не нашли эту строку, то вам необходимо установить завиток:

// ubuntu 
sudo apt-get install php5-curl 

// centos 
sudo yum install php5-curl 

Для окон или ваш WampServer это должно быть легко.

+0

if ($ siteSource === false) echo 'Curl error:'. curl_error ($ завиток); Это неверно. Хотя это работает: if ($ siteSource = false) echo 'Curl error:'. curl_error ($ завиток); (один знак меньше), но нет ошибки. Таким образом, он выводит: «Curl error:» – SuperSpy

+1

Я добавил несколько идей. Говорю вам, что я никогда не терял битву, используя завиток, поэтому будьте настойчивы. Удачи ... –

+0

Добавил все те. Не работает. Я снова обновил свой вопрос. – SuperSpy

1

Есть две вещи, которые я могу видеть, которые не так с этим кодом:

Переключение имен переменных между созданием ресурса и его выполнения:

$curl = curl_init();     // $curl 
$siteSource = curl_exec($curlTable); // $curlTable 

You сделал запрос на отправку, но не установил тип контента, вы должны сделать это:

$postFields = array(
    'user' => $userNum, 
    'paswoord' => $userPass, 
    'login' => 'loginform' 
); 
// This ensures all strings are properly encoded 
$postData = http_build_query($postFields); 

// ... 

// curl *should* do this by itself, but best to do it explicitly 
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
    'Content-Type: application/x-www-form-urlencoded', 
    'Content-Length: '.strlen($postData), 
    'Connection: close' 
)); 
+0

Первый - это ошибка приобретения. В моем коде это сделано правильно. Я редактировал свой пост. Спасибо, что заметили. Также я включил функцию построения, спасибо. Добавлена ​​опция заголовка, как вы указали. Но все же пустая страница. (он возвращает false) – SuperSpy

+0

Можете ли вы предоставить фактический URL-адрес сайта, к которому вы пытаетесь получить доступ, чтобы я мог сам его проверить? – DaveRandom

10

Несмотря на то, что этот вопрос устарел, сегодня у меня такая же проблема, и я не решил его ни с одним из предложений. Причина того, что печенье не были сохранены просто отсутствующий вызов

curl_close() 

Если curl_close не вызывается после завитка запроса печенье не сохраняются.

Взял меня около часа, чтобы узнать .... возможно экономит ваше время :-)

-1

В моей ситуации там были две проблемы: 1) сервер не принял печенье без стоимости 2) I не использовался вариант CURLOPT_COOKIEFILE

Каждая проблема решается путем деления ее на отдельные части и решения каждой из них.

Так что я рекомендую вам разделить вашу проблему: 1) Проверить эта проблема COOKIEFILE или веб-сайт - отправить значение куков непосредственно без файла - может быть есть проблема с сервером 2) Если это будет нормально - проверить содержимое файла может быть что-то не так (как в моей ситуации)

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