Yii PHP framework: Запускаем Curl из консоли

Владимир | | PHP, Web разработка, Yii.

yii php console

Сегодня я продолжу рассказывать об использовании фреймворка Yii. На этот раз речь пойдёт о создании консольных приложений. Их удобно запускать с помощью планировщика, поэтому чаще всего они используются выполнения действий вроде отправки отчетов на eMail, получения данных и т.п. Вашу фантазию тут никто не ограничивает 😉

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

Рассмотрим небольшой пример. Допустим, нам нужно периодически проверять содержимое какой-нибудь web страницы, и записывать его в базу.

Для получения страницы удобно использовать cURL, о котором я неоднократно рассказывал, а для работы с БД используем библиотеку фреймоворка.

Создаём входной скрипт.

Я предполагаю, что вы уже создали обычное web приложение (например, с помощью команды yiic webapp). Входной скрипт web приложения называется index.php. Создаём в этой же папке файл console.php и копируем в него содержимое index.php. После этого изменяем имя файла конфигурации и в последней строке указываем, что нам нужно создать консольное приложение (Yii::createConsoleApplication).

В результате должно получиться примерно следующее.

$yii=dirname(__FILE__).'/path_to_yii/framework/yii.php';
$config=dirname(__FILE__).'/protected/config/console.php';

// remove the following line when in production mode
defined('YII_DEBUG') or define('YII_DEBUG',true);

require_once($yii);
Yii::createConsoleApplication($config)->run();

Кстати, файл конфигурации для консольного приложения автоматически создаётся утилитой yiic.

Создаём команду.

Команды (потомки класса CConsoleCommand) используются для выполнения действий из консоли. В данном случае мы создадим файл protected/commands/CurlCommand.php и объявим в нём класс CurlCommand.

class CurlCommand extends CConsoleCommand {
	public function run($args) {
		$ch = curl_init();    // инициализация
		curl_setopt($ch, CURLOPT_URL, 'http://www.google.com'); // устанавливаем URL
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);// разрешаем редирект
		curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); // указывает, что функция curl_exec должна вернуть полученный ответ, а не отправить его сразу браузеру
		$result = curl_exec($ch); // запуск
		curl_close($ch);
		echo 'We got '.strlen($result).' bytes.';
	}
}

Имя класса формируется из имени команды и суффикса Command. Чтобы команда заработала необходимо реализовать метод run, который будет выполнять все действия. В данном случае, мы настраиваем cURL и получаем главную страницу google.com и выводим её размер. Но настройка и использование cURL – не тема этой статьи, вернёмся к методу run.

При вызове команды мы можем передать ей дополнительные агрументы, например, так:
php console.php command par1 par2
При этом фреймворк создаст массив с par1 и par2, и передаст его в $args. Таким образом, можно получить доступ к этим параметрам внутри метода run().

Работа с базой данных

Осуществляется точно так же как и в обычном web приложении. Главное указать в файле конфигурации необходимые настройки.

Для подключения к базе данных в файле protected/config/console.php создаём массив components с элементом db, в котором указываем настройки подключения к базе.

'components'=>array(
	'db'=>array(
		'connectionString' => 'sqlite:protected/data/pf.db',
		'tablePrefix' => 'pf_',
	),
),

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

'import'=>array(
	'application.models.*',
),

После этого можно работать с БД. Например, если есть у вас есть модель Users, то создать нового пользователя можно с помощью следующего кода.

$newUser = new Users;
$newUser->u_name = 'dfsg';
$newUser->u_pass = md5('dfg');
$newUser->save();

Запуск

Тут всё просто. Вводим в консоли

php console.php curl

И смотрим на результат. У меня скрипт вывел «We got 8571 bytes».
Эту же команду можно указать при создании задачи для планировщика.

Как видите, разработчики Yii неплохо продумали работу со скриптами из консоли. Главное, вы имеете доступ ко всем компонентам и библиотекам фреймворка, но можете управлять их использованием независимо от основного web приложения.

Полезные ссылки.

Модные, брендовые сумки — любимый и очень стильный аксессуар в женском гардеробе.

Евро матрасы обеспечат комфорт и спокойный сон.

  • Приветствую. Не знаю куда написать, пишу сюда.
    Как называется плагин которым Вы пользуетесь добавляя отрывки кода в текст?

  • Приветствую. Не знаю куда написать, пишу сюда.
    Как называется плагин которым Вы пользуетесь добавляя отрывки кода в текст?

  • Sanne80

    А где указывается периодичность?0

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

  • Saiber

    Если скрипт выполняется долго,  как вызвать его на повторное выполнение с метода

    • Saiber

      с параметрами которые будут генерироваться в методе

    • Saiber

      Вопрос решен:
      Из-за неограниченных возможностей использования PHP в командной строке максимальное время выполнения скрипта не ограничено……

  • script

    Не подскажете что может быть за проблема exception 'CDbException' with message 'CDbConnection failed to open the DB connection: could not find driver'?

    Вроде конфиг прописал и автозагрузку моделей.

    • Не найден драйвер для базы данных.

      В php.ini должны быть раскомментированы строки.
      extension=php_pdo_mysql.dll
      extension=php_mysql.dll
      extension=php_mysqli.dll
      если используете mysql.
      Соответственно, функция phpinfo() должна вывести информацию о том, что эти расширения подключены.

  • Дмитрий Елисеев

    Ещё я в http://www.elisdn.ru/blog/50/console-commands-in-yii некоторые нюансы рассмотрел.