Асинхронное выполнение php-скрипта работает с аутентифицированным сеансом - PullRequest
1 голос
/ 16 марта 2012

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

Мой скрипт main-php:

function backgroundPost($url){

    $parts=parse_url($url);

      $fp = fsockopen($parts['host'],
              isset($parts['port'])?$parts['port']:80,
              $errno, $errstr, 30);


      if (!$fp) {
          return false;
      } else {
          $out = "POST ".$parts['path']." HTTP/1.1\r\n";
          $out.= "Host: ".$parts['host']."\r\n";
          $out.= "Content-Type: text/plain\r\n";
          $out.= "Content-Length: ".strlen($parts['query'])."\r\n";
          $out.= "Content-Length: ".strlen($parts['query'])."\r\n";
          $out.= "Connection: Close\r\n\r\n";
          if (isset($parts['query'])) $out.= $parts['query'];

          fwrite($fp, $out);

          fclose($fp);

          return true;
      }
    }

    //Example of use
    backgroundPost('http://192.168.1.107/smic/testarea/runner.php?id=1');

Ответ от fwrite () - "155".

backgroundPost возвращает значение true.

runner.php:

ignore_user_abort(true);
set_time_limit(50);
error_log("RUNNING!"); 

Как получается, что «RUNNING!» Записывается в журнал ошибок? Это похоже на то, что скипт фактически не выполняется.

При непосредственном доступе к runner.php (с URL-адресом, размещенным в backgroundPost), скрипт работает должным образом.

Оба скрипта имеют привилегию 777 для apache: apache.

Работает на

  • Linux / CentOS 6.2
  • PHP 5.3.3
  • Apache 2.2.15

Может ли это быть связано с тем, что я использую аутентифицированныйсеанс и аутентифицируемый пользователь, конечно же, не apache, который запускает сценарии?

Тест с CURL

Предложено @jprofitt Я попробовалcurl:

async_curl.php:

$ch = curl_init("http://192.168.1.107/");
$fp = fopen("http://192.168.1.107/smic/testarea/runner.php", "r");

curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC ) ;
curl_setopt($ch, CURLOPT_USERPWD, "kaand:xIWGWt0DNVriw"); 
curl_setopt($ch, CURLOPT_HEADER, true); 
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);

curl_exec($ch);
$info = curl_getinfo($ch);
echo print_r($info);
curl_close($ch);
fclose($fp);

Tis печатается из curl_getinfo ($ ch):

Array
(
    [url] => http://192.168.1.107/
    [content_type] => text/html; charset=UTF-8
    [http_code] => 302
    [header_size] => 411
    [request_size] => 103
    [filetime] => -1
    [ssl_verify_result] => 0
    [redirect_count] => 0
    [total_time] => 0.002165
    [namelookup_time] => 0.000106
    [connect_time] => 0.000192
    [pretransfer_time] => 0.000211
    [size_upload] => 0
    [size_download] => 0
    [speed_download] => 0
    [speed_upload] => 0
    [download_content_length] => 0
    [upload_content_length] => 0
    [starttransfer_time] => 0.002109
    [redirect_time] => 0
    [certinfo] => Array
        (
        )

    [redirect_url] => http://192.168.1.107/login.php
)
1

Я сделалпопробуйте с $ ch = curl_init ("http://192.168.1.107/");, а затем я получил сообщение" Требуется авторизация "на моем веб-сайте. В error_log я получаю HTTP / 1.1 401 Авторизация требуется дляrunning.php.

Я также получаю жалобы в error_log о том, что $ fp "не является допустимым ресурсом дескриптора файла" при выполнении curl_setopt ($ ch, CURLOPT_FILE, $ fp); '.

Тамэто перенаправление на страницу входа в конце массива, это может быть связано с этой проблемой?

1 Ответ

0 голосов
/ 17 марта 2012

Итак, моя проблема была связана с запретной областью runner.php. Использую ли я curl или fsockopen, мне нужно аутентифицировать запрос. Здесь я включаю решение как для fsockopen, так и для curl, делающего асинхронный запрос для ограниченных областей.

fsockopen:

function backgroundPost($url){        

    $parts=parse_url($url);
    echo $parts['path']."<br/>"; 
    echo $parts['host']."<br/>"; 
    echo $url;

  $fp = fsockopen($parts['host'],  
          isset($parts['port'])?$parts['port']:80,
          $errno, $errstr, 10);

 $auth = base64_encode("kaand:kaand123");
  if (!$fp) {
      return false;
  } else {
      $out = "POST ".$parts['path']." HTTP/1.1\r\n";
      $out.= "Host: ".$parts['host']."\r\n";
      $out.= "User-Agent: Anonymous\r\n";
      $out.= "Content-Type: text/plain\r\n";
      $out.= "Authorization: Basic ".$auth;
      $out.= "Content-Length: ".strlen($parts['query'])."\r\n";
      $out.= "Connection: Close\r\n\r\n";
      if (isset($parts['query'])) $out.= $parts['query'];

      fwrite($fp, $out);

      fclose($fp);

      return true;
  }
}

Пример использования:

backgroundPost('http://192.168.1.107/smic/testarea/runner.php?id=1');

локон:

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "http://192.168.1.107/smic/testarea/runner.php");
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC ) ;
curl_setopt($ch, CURLOPT_USERPWD, "kaand:kaand123"); //Don't use the sha1-value
curl_setopt($ch, CURLOPT_HEADER, true); 
curl_setopt($ch, CURLOPT_TIMEOUT, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);

curl_exec($ch);
curl_close($ch);

runner.php

do whatever...

Я думаю, я пойду на fsockopen, думаю, что это более хорошее решение, чем тайм-ауты, которые заставляют вас хотя бы немного подождать. Если трафика будет много, даже 1 секунда может возрасти ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...