Скрипты php для linux

Системные скрипты на php для linux, пишем скриншотер

Многие люди считают что php подходит только для разработки сайтиков, и никак не может быть использован, в других областях применения языков программирования, для создания программ… В этой статье я бы хотел осветить, применение php скриптов «не целевым» образом, а именно мы напишем скрипт который будет делать скрин, выгружать его на yandex диск и выводить адрес скриншота в консоль…

Рассмотрим структуру проекта, она очень проста и состоит из 3-х файлов:

1. screen.php — точка входа в приложение.
2. classes/autoload.php — автолоадер проекта.
3. classes/Request.php — класс реализующий запросы к api яндекса.

Далее расмотрим код screen.php:

#!/usr/bin/php getOauthLink();die; > $home = $_SERVER['HOME']; $config = include($home . '/.config/scrphp/config.php'); $nameScreenshot = date('Y_m_d_G_i_s_') . 'screen.png'; system('scrot -s /tmp/'.$nameScreenshot); $result = $request ->setToken($config['token']) ->setFileNameOnDisk($nameScreenshot) ->setPathToFile('/tmp/'.$nameScreenshot) ->upload() ->publicateFile(); $url = $result['public_url']; echo $url.PHP_EOL; 

Как видите это точка входа в приложение, логика проста:
1. Формирование имени скриншота
2. Вызов системной программы scrot
3. Запрос api yandex.disk и выгрузка скриншота

Файл autoload.php тоже очень прост и состоит всего из трёх строк кода, я приведу его лишь для ознакомления, и мы не будем его рассматривать подробно.

spl_autoload_register(function($name)< require_once __DIR__.'/'.$name.'.php'; >); 

Работа с yandex api довольно проста я написал небольшой класс Request.php, с набором неких методов, которые помогают мне в работе с ним…

 * [& device_id=] * [& device_name=] * [& display=popup] * [& login_hint=] * [& force_confirm=yes] * [& state=] */ $link = 'https://oauth.yandex.ru/authorize' .'?response_type=token' . '&client_id=8fc231e60575439fafcdb3b9281778a3'; echo $link; > /** * set file path on disk * @param $filePath * @return $this */ public function setFileNameOnDisk($name) < /** * https://cloud-api.yandex.net/v1/disk/resources/upload ? * path=*/ $link = 'https://cloud-api.yandex.net/v1/disk/resources/upload?path='.urlencode('/'.trim($name,'/')); $response = file_get_contents($link,false,$this->_context('GET')); $responseAsArray = json_decode($response,true); $this->_href = $responseAsArray['href']; $this->_method = $responseAsArray['method']; $this->_fileName = $name; return $this; > /** * get path to file on local disk * @param $path * @return $this */ public function setPathToFile($path) < $this->_filePath = $path; return $this; > /** * upload file to disk */ public function upload() < $ch = curl_init($this->_href); curl_setopt($ch,CURLOPT_HTTPHEADER, array( 'Authorization', 'OAuth '.$this->_token ) ); curl_setopt($ch,CURLOPT_INFILE,fopen($this->_filePath,"r")); curl_setopt($ch,CURLOPT_INFILESIZE,filesize($this->_filePath)); curl_setopt($ch,CURLOPT_PUT,true); curl_exec($ch); curl_close($ch); return $this; > /** * public file and get public url for screenshot * @return mixed */ public function publicateFile() < /** * https://cloud-api.yandex.net/v1/disk/resources/publish ? * path=*/ $link = 'https://cloud-api.yandex.net/v1/disk/resources/publish?path='.urlencode('/'.trim($this->_fileName,'/')); $response = file_get_contents($link,false,$this->_context('PUT')); $responseAsArray = json_decode($response,true); $publicateFile = file_get_contents($responseAsArray['href'],false,$this->_context($responseAsArray['method'])); $publicateFileAsArray = json_decode($publicateFile,true); return $publicateFileAsArray; > /** * set oauth token * @param $key * @return $this */ public function setToken($token) < $this->_token = $token; return $this; > /** * get context for request by file_get_contents * @param $method * @return resource */ private function _context($method) < /** * Authorization: OAuth */ $opts = array( 'http'=>array( 'method'=>$method, 'header'=>"Authorization: OAuth ".$this->_token."\r\n" ) ); $context = stream_context_create($opts); return $context; > > 

Рассмотрим ключевые методы данного класса для запроса методов api в основном я использовал file_get_contents, и так как мне приходилось использовать, его при запросе многих методов я написал метод генерации контекста:

 /** * get context for request by file_get_contents * @param $method * @return resource */ private function _context($method) < /** * Authorization: OAuth */ $opts = array( 'http'=>array( 'method'=>$method, 'header'=>"Authorization: OAuth ".$this->_token."\r\n" ) ); $context = stream_context_create($opts); return $context; > 

Он тоже довольно прост мы создаём контекст с определённом методом запроса и информации об аутентификации…

Далее нам необходимо «создать файл на yandex.disk» это действие мы производим следующим методом:

 /** * set file path on disk * @param $filePath * @return $this */ public function setFileNameOnDisk($name) < /** * https://cloud-api.yandex.net/v1/disk/resources/upload ? * path=*/ $link = 'https://cloud-api.yandex.net/v1/disk/resources/upload?path='.urlencode('/'.trim($name,'/')); $response = file_get_contents($link,false,$this->_context('GET')); $responseAsArray = json_decode($response,true); $this->_href = $responseAsArray['href']; $this->_method = $responseAsArray['method']; $this->_fileName = $name; return $this; > 

Как я говорил ранее мы запрашиваем api с помощью функции file_get_contents. После того как этот метод отработает, и вся информация будет запрошена, запускаеться метод upload:

 /** * upload file to disk */ public function upload() < $ch = curl_init($this->_href); curl_setopt($ch,CURLOPT_HTTPHEADER, array( 'Authorization', 'OAuth '.$this->_token ) ); curl_setopt($ch,CURLOPT_INFILE,fopen($this->_filePath,"r")); curl_setopt($ch,CURLOPT_INFILESIZE,filesize($this->_filePath)); curl_setopt($ch,CURLOPT_PUT,true); curl_exec($ch); curl_close($ch); return $this; > 

В данно случае можно было бы использовать для отправки файла одну из функций `file_get_contents` или `file_put_contents` но это не целесообразно, по причине того что пришлось бы, в контексте данных функций, в ручную имитировать заголовки и другие вытекающие из этого проблемы, так что проще просто использовать для этих целей curl.

И так файл загружен, остаёться только опубликовать его и получить прямую ссылку для просмотра, это выполняет функция publicateFile():

 /** * public file and get public url for screenshot * @return mixed */ public function publicateFile() < /** * https://cloud-api.yandex.net/v1/disk/resources/publish ? * path=*/ $link = 'https://cloud-api.yandex.net/v1/disk/resources/publish?path='.urlencode('/'.trim($this->_fileName,'/')); $response = file_get_contents($link,false,$this->_context('PUT')); $responseAsArray = json_decode($response,true); $publicateFile = file_get_contents($responseAsArray['href'],false,$this->_context($responseAsArray['method'])); $publicateFileAsArray = json_decode($publicateFile,true); return $publicateFileAsArray; > 

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

Установка скрипта

Чтож мы закончили, теперь нам предстоит придумать а как же этот скрипт будет работать из консоли? как его запустить там в «глобальной области»? ответом на эти вопросы будет phar — архив содержащий файлы php и способный выполняться как отдельное приложение, похож на тот же jar.

phar мы будем собирать с помощью утилиты box.phar для этого мы пишем простой конфигурационный файл box.json:

И наш проект готов теперь осталось только установить права на исполнение файла, и скопировать в директорию /usr/bin/srcphp:

$ chmod +x srcphp.phar $ cp srcphp.phar /usr/bin/srcphp 

Не забываем о конфигурации файла /home/myname/.config/srcphp/config.php:

в token необходимо вписать полученный oAuth токен от яндекса, при переходе сгенерированной по средством запуска скрипта с ключом —getToken:

Выводы

Главная мысль статьи — рассмотреть как создать консольное приложение с помощью php, на примере программы скриншотера, в следующих я буду поднимать тему использования php в различных сферах применения, и следующая статью будет посвящена разработки простого драйвера usb устройства для linux. Спасибо за внимание и доброго дня.

Источник

PHP скрипты в Linux

Зачем может понадобиться запускать скрипты PHP через интерфейс командной строки Linux. Первое и самое очевидное решение, мы пишем простой скрипт который должен делать нечто в нашей системе. Мы используем PHP как расширенный Bush-скриптинг. Хотим как-то особенно сортировать файлы, делать запись в базу данных, отправлять сообщения или все одновременно. PHP позволяет реализовать это с легкостью. Повесим скрипт в Crone и вот полноценное системное приложение, несущее полезную нагрузку.

Для начала нам нужно убедится что PHP установлен в систему, сделаем вывод версии PHP по умолчанию:

Важно понимать, в системе может быть установленно много версий PHP, но только одна будет запущена при старте проекта. Бинарные исполняемые файлы можно посмотреть командой:

Есть два варианта запуска PHP:

  1. Через файл, создаем файл с кодом и запускаем его
  2. Через консоль, заходим в оболочку PHP и пишем скрипт который потом вызываем

Для реализации первого варианта запуска, нам достаточно создать и вызвать файл с кодом PHP, создаем файл в корневой дириктории:

Заполняем файл содержимом:

Вызываем файл в корнеыой дириктории из консоли:

Для реализации второго варианта запуска, нам нужно написать и вызват скрипт прямо в консоле php используя интерактивную оболочку в которую нужно зайти используя команду:

Общий вид консоли поменяется:

PHP скрипты

Теперь можно вызывать PHP команды, например:

Чтобы полноценно работать с консолью в PHP существует пакет php-cli :

Основная возможность о которой следует помнить, теперь для PHP который мы будем использовать в консоли есть свой php.ini .

Настроить его можно, найдя нужный файл в системе, важно понимать что файлы php.ini для консоли и сервера будут разные, посмотреть местоположение нужного файла php.ini можно через phpinfo() . Вы можете внести все необходимые настройки. Например, можно увеличить лимиты для скриптов запускаемых из консоли или установить какие-то небезопасные параметры, которые будут использоваться только через php-cli .

Источник

Читайте также:  Название документа
Оцените статью