PHP является одним из наиболее популярных языков программирования в вебе. Своей популярностью он в первую очередь обязан легкости в изучении и многофункциональности. Но сфера его применения не заканчивается только на создании простых веб-страничек. PHP-скрипты можно запускать из командной строки, что позволяет писать на нем полноценные консольные приложения.

Как запустить php-скрипт из командной строки?

Независимо от используемой операционной системы, для запуска скрипта необходимо набрать в консоли следующую команду:

php script.php

Ваша ОС может выдать сообщение о том, что команда php ей неизвестна. В таком случае, и если вы уверены, что сам интерпретатор PHP установлен корректно, поможет указание полного пути к интерпретатору во время запуска скрипта.

В Windows:

C:\php\php.exe script.php

Для UNIX-подобных систем:

/usr/bin/php script.php

Обратите внимание, что путь к интерпретатору PHP на вашей системе может быть другим, поэтому это тоже надо учесть. Например, для пользователей популярного пакета WampServer путь может быть таким:

C:\wamp\bin\php\php5.3.8\php.exe

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

Пишем простой скрипт для проверки кода ответа сервера

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

Сразу после запуска скрипт выбирает все файлы с расширением *.txt из папки files. Затем выводит данный список пользователю в формате номер => имя и ждет от пользователя ввода номера интересующего его файла.

Получение всех файлов по маске делается просто, для этого воспользуемся стандартной функцией glob, а вот с чтением данных из консоли всё немного интересней. Дело в том, что после запуска скрипта из командной строки в нем открываются три стандартных потока: для вывода (STDOUT), ввода (STDIN) и ошибок (STDERR). Указатели на эти потоки доступны для скрипта в виде одноименных констант и работать с ними можно так же как, например, с обычными файлами. Таким образом, чтобы прочитать данные из консоли достаточно просто прочитать строку из потока ввода: fgets(STDIN).

  $files = glob('files/*.txt');
  
  $files or exit('No files to check.'.PHP_EOL);
  
  echo 'Files in folder: '.count($files).PHP_EOL;
  foreach ($files as $index => $name) {
      echo "[{$index}] => {$name}".PHP_EOL;
  }
  
  echo 'Choose the file: ';
  $choice = intval(fgets(STDIN));

После того, как пользователь сделал свой выбор и проверки правильности выбора, мы можем открыть файл для чтения.

  array_key_exists($choice, $files) or exit('Wrong file selected.'.PHP_EOL);

  $file = $files[$choice];
  
  echo "Processing file '{$file}'...".PHP_EOL;
  
  $start_time = microtime(true);
  $code_stats = array();
  
  $f = fopen($file, 'r');

С помощью цикла while начинаем перебирать все строки в файле. Строки должны быть корректными url-адресами иначе мы не сможем определить правильный код ответа сервера. Заголовки для каждого адреса получаем с помощью стандартной функции get_headers, а код ответа находится обычно в первой строке заголовка.

  while ($url = trim(fgets($f))) {
      $headers = get_headers($url);
      
      if (is_array($headers)) {
          array_key_exists($headers[0], $code_stats) or $code_stats[$headers[0]] = 0;
          $code_stats[$headers[0]]++;
          echo date('H:i:s')." HTTP code '{$headers[0]}' for url '{$url}'".PHP_EOL;
      }
      else {
          array_key_exists('Unknown', $code_stats) or $code_stats['Unknown'] = 0;
          $code_stats['Unknown']++;
          echo date('H:i:s')." Problem with url '{$url}'".PHP_EOL;
      }
  }
  
  fclose($f);

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

  $elapsed_time = round(microtime(true) - $start_time, 3);
  
  echo "File processed in {$elapsed_time}s".PHP_EOL;
  echo "Code stats are:".PHP_EOL;
  print_r($code_stats);

Результатом работы такого приложения может быть, например, такой вывод:

  $ php check.php 
  Files in folder: 1
  [0] => files/db.txt
  Choose the file: 0
  Processing file 'files/db.txt'...
  18:33:43 HTTP code 'HTTP/1.0 200 OK' for url 'http://mail.ru/'
  18:33:45 HTTP code 'HTTP/1.1 301 Moved Permanently' for url 'http://yandex.ru/'
  18:33:46 HTTP code 'HTTP/1.1 302 Moved Temporarily' for url 'http://rambler.ru/'
  18:33:47 HTTP code 'HTTP/1.0 301 Moved Permanently' for url 'http://google.ru/'
  File processed in 5.558s
  Code stats are:
  Array
  (
      [HTTP/1.0 200 OK] => 1
      [HTTP/1.1 301 Moved Permanently] => 1
      [HTTP/1.1 302 Moved Temporarily] => 1
      [HTTP/1.0 301 Moved Permanently] => 1
  )

Выводы

Вот и всё, простое и интерактивное консольное приложение на PHP готово. Мне не хотелось писать какую-нибудь совершенно бесполезную программу, поэтому этот скрипт подходит не только для изучения, но и для использования. Например, если сохранить в текстовый файл карту сайта, то скрипт поможет определить возможные ошибки с ссылками, а если его немного доработать, то даже укажет с какими именно :).

Само приложение можно скачать здесь.

Рассказать друзьям: