Как устанавливать скрипты? — Как создать сайт —

Как устанавливать скрипты? - Как создать сайт - Хостинг

Обоснование (зачем эта статья)

В общем как я уже писал выше когда мы столкнулись с необходимостью запускать много php скриптов без участия web-сервера (грубо говоря из другого php скрипта), то первое что пришло на ум это …

shell_exec('php pathtoscript.php')

Но при запуске каждого скрипта, будет создаваться окружение, запускаться отдельный процесс, в общем как то затратно по ресурсам нам показалось. Данную реализацию отвергли. Второе что пришло на ум это конечно же php-fpm, он ведь такой крутой, всего один раз запускает окружение, следит за памятью, все там логирует, корректно запускает и останавливает скрипты, в общем все делает круто, и нам конечно же этот путь понравился больше.

Но вот незадача, в теории то мы знали как это работает, в общих чертах (как оказалось в очень общих), но вот реализовать этот протокол на практике без участия web-сервера оказалось довольно трудно. Чтение спецификаций и пару часов безуспешных попыток показали что для реализации потребуется время, которого у нас на тот момент не было.

Манов по реализации данной затеи, в которых было бы просто и понятно описано данное взаимодействие не нашлось, спеки наскоком взять тоже не удалось, из готовых решений нашли питоновский скрипт и пыховскую либу на гитхабе, которую в итоге не захотели тащить к себе в проект (может это и не правлиьно но не особо мы любим всякие сторонние библиотеки да еще и не очень то и популярные, а значит и не проверенные). В общем по итогу от этой идеи мы отказались и реализовали все это через старых добрый rabbitmq.

Хоть задачу в итоге и решили, но разобраться в FastCgi детально я все таки решил, и в добавок решил написать об этом статью, в которой будет просто и подробно описано как заставить php-fpm запустить php скрипт без web-сервера, а точнее в качестве web-сервера будет другой скрипт, далее его буду называть Fcgi клиент.

Актуальный список функций, которые запрещено использовать

popen,pclose,stream_copy_to_stream,dio_close,dio_fcntl,dio_open,dio_read,dio_seek,dio_stat,dio_tcsetattr,dio_truncate,dio_write,exec,passthru,proc_close,proc_get_status,proc_nice,proc_open,proc_terminate,shell_exec,system,expect_expectl,expect_popen,pcntl_alarm,pcntl_exec,pcntl_fork,pcntl_getpriority,pcntl_setpriority,pcntl_signal_dispatch,pcntl_signal,pcntl_sigprocmask,pcntl_sigtimedwait,pcntl_sigwaitinfo,pcntl_wait,pcntl_waitpid,pcntl_wexitstatus,pcntl_wifexited,pcntl_wifsignaled,pcntl_wifstopped,pcntl_wstopsig,pcntl_wtermsig,posix_access,posix_ctermid,posix_errno,posix_get_last_error,posix_getcwd,posix_getegid,posix_geteuid,posix_getgid,posix_getgrgid,posix_getgrnam,posix_getgroups,posix_getlogin,posix_getpgid,posix_getpgrp,posix_getpid,posix_getppid,posix_getpwnam,posix_getpwuid,posix_getrlimit,posix_getsid,posix_getuid,posix_initgroups,posix_isatty,posix_kill,posix_mkfifo,posix_mknod,posix_setegid,posix_seteuid,posix_setgid,posix_setpgid,posix_setsid,posix_setuid,posix_strerror,posix_times,posix_ttyname,posix_uname,ftok,msg_get_queue,msg_queue_exists,msg_receive,msg_remove_queue,msg_send,msg_set_queue,msg_stat_queue,sem_acquire,sem_get,sem_release,sem_remove,shm_attach,shm_detach,shm_get_var,shm_has_var,shm_put_var,shm_remove_var,shm_remove,shmop_close,shmop_delete,shmop_open,shmop_read,shmop_size,shmop_write,apache_child_terminate,apache_get_modules,apache_get_version,apache_getenv,apache_lookup_uri,apache_note,apache_request_headers,apache_reset_timeout,apache_response_headers,apache_setenv,getallheaders,virtual,nsapi_request_headers,nsapi_response_headers,nsapi_virtual,mail,mysql_stat,mysql_pconnect

Бесплатный хостинг для сайта | записки web-разработчика

Добрый день, уважаемые посетители!!! Сегодня наш разговор пойдет о хостинге. Мы поговорим с вами, что такое хостинг, для чего он нужен, каких видов он бывает. И в конце как всегда будет самое интересное: я дам вам список бесплатных хостингов для установки своего сайта. У них есть свои плюсы и минусы, но воспользоваться ими есть смысл, особенно для начинающих вебмастеров. Вы можете отработать на бесплатном хостинге все свои приемы и методы, чтобы понять для чего вам нужен сайт, а уже потом решать, стоит ли покупать платный хостинг или нет. Ну, начинаем…

Вот что говорит об хостинге всеми известная Википедия:

Хостинг (англ. hosting) — услуга по предоставлению вычислительных мощностей для физического размещения информации насервере, постоянно находящемся в сети (обычно Интернет). Хостингом также называется услуга по размещению оборудования клиента на территории провайдера с обеспечением подключения его к каналам связи с высокой пропускной способностью.

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

  • поддержка CGI: Perl, PHP, Python, ASP, Ruby, JSP
  • поддержка .htaccess/.htpasswd (для Apache)
  • поддержка баз данных

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

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

А теперь собственно сам список. Все ссылки проверены на работоспособность и актуальны на момент публикации. Если вы найдете где ошибку или битую ссылку, то пишите об этом в комментариях — исправим. Также приветствуется ссылки бесплатного хостинга, которого нет в этом списке.

ХостерПримечание
Addr.ru
Бесплатный хостинг c поддержкой PHP, MySQL и доменным именем 2-го уровня. Предоставляется по заявке через систему запросов с описанием проекта. Лимиты по объему памяти и траффику устанавливаются для каждого сайта индивидуально после собеседования.
Alfaspace.NET
Бесплатный хостинг с поддержкой PHP и CGI взамен на рекламу. Для некоммерческих проектов есть возможность обойтись без рекламы. Если оставить на форуме 200 сообщений, то предоставляется доступ и к MySQL.
Bel-Host
Компания Bel-Host предлагает Вам профессиональные услуги по размещению проектов в Интернете. Bel-Host – молодая хостинговая компания, в Белоруссии. Наш недорогой хостинг доступен не только малым или крупным компаниям, но и частным клиентам. На сегодняшний день «Bel-Host» является одним из самых гибких и заботливых хостинг провайдеров в СНГ.
Bestof.ru
Благотворительный хостинг, размещающий русскоязычные некоммерческие ресурсы на полностью безвозмездной основе. Предъявляются высокие требования к размещаемым ресурсам в плане их социальной важности, ценности, уникальности или значимости для Российской аудитории пользователей.
Chat.ru
Бесплатный хостинг одиного из наиболее популярных Российских серверов, предоставляющих широкий спектр бесплатных Интернет-услуг.
DKHOST.ORG
Днепропетровский филиал «Хостин-Центр DKHOST.ORG» Характеристики серверов: Intel(R) Xeon(R) CPU E5520 @ 2.27GHz 12 Gb RAM Каналы связи с Интернетом: 100 MBPS Расположение: The Planet(США) Немного статистики: Количество поддерживаемых доменов: более 2500 Пропускная способность каналов датацентра: 22 ГБ/сек Средняя загруженность серверов: 10%
Eclub.lv
Бесплатный хостинг в Латвии. Поддержка PHP, возможность отключить рекламу хостера.
Fatal.ru
Бесплатный хостинг с возможностью использования своих CGI скриптов и PHP, доступ к .htaccess. Предоставляется до 5 почтовых ящиков.
Garanthost.ru
По желанию клиента, для него может быть разработан индивидуальный тарифный план на услуги виртуального хостинга. Также для социально значимых проектов возможно предоставление услуг хостинга бесплатно.
Hobby.ru
Бесплатный хостинг компании «Зенон Н.С.П.», предоставляющей также платный хостинг на zenon.net. Принимаются только некоммерческие проекты. Спосорсая поддержка интересных проектов.
Holm.ru
Один из самых популярных бесплатных хостингов с PHP, MySQL и неограниченным пространством при условии обоснования.
HostHolder.ru
Бесплатный хостинг в обмен на рекламу. Клиент сам выбирает необходимые параметры сервера.
hostiman.ruЭто хостинг-провайдер, который предоставляет как платный, так и бесплатный хостинг (free hosting) для сайта без рекламы и баннеров. Разрешается размещать только легальные и законные сайты без спама и ddos атак. Хостинга поддерживает все современные технологии и функции: CloudLinux ISPmanager 5, выбор версии PHP 5.2 — 7.0, неограниченный трафик, автоматический BackUp, FTP, MySQL, Cron
hqhost
бесплатный хостинг картинок и фотографий
Hut.ru
Бесплатный хостинг с поддержкой PHP, MySQL, бесплатные доменные имена второго уровня, неограниченное место для интересных проектов.
InfiumHost
ООО «Инфиум» Виртуальный хостинг, VIP-хостинг. Виртуальные сервера VDS/VPS, с бесплатной панелью. Выделенные сервера любой конфигурации. Колокейшн, размещение оборудования. Аренда стойки, шкафа, юнита. Любая форма оплаты.
Internethost.ru
Предоставляется бесплатный хостинг после того, как платно регистрируется домен 2-го уровня или если домен уже имеется.
KM.RU
Бесплатный хостинг универсального Интернет-портала KM.RU. Предоставляется на выбор Unix или Windows хостинг с технологиями PHP/MySQL или ASP/MSSQL соответственно.
LibertyTraffic
Хостинг PHP/MySQL, условное ограничение по Гигабайтам Регистрация за 5 минут. Удобная панель управления — ISPManager Apache PHP MySQL PHP: GD, zlib, mbstring, mysqli, mcrypt и др. Дисковое пространство — 500 Мб Трафик (Мб)- не ограничено Доменов (Сайтов на аккаунт) — 1 Почтовые протоколы — POP3/SMTP/IMAP/Web Базы данных MySQL — 1
MegaHoster.Network
Компания MegaHoster.Network предоставляет как платный хостинг и аренду серверов, так и бесплатный хостинг для уже существующих сайтов, отвечающих некоторым требованиям по посещаемости и тематике. Сервера расположены в крупнейших дата-центрах планеты ThePlanet.Com & Savvis D1: Даллас, Техас, США и в Москве — М9.
MyLivePage.ru
Система для создания бесплатных персональных интерактивных сайтов объединенных в социальную сеть. После регистрации пользователь получает сайт, который сразу же готов к использованию и у сайта сразу есть все классические разделы: web-страницы, блог, форум, чат, хранилище картинок и файлов.
Narod.ru
Один из самых популярных бесплатных хостингов сайтов. Принадлежит Яндексу. Конструктор веб-страниц.
Null-Host
Предоставляется бесплатный хостинг с PHP и MySql. Размещение до 2-х сайтов. Необходимо иметь собственный домен. Размещение происходит на собственном VPS. Физически дата-центр находится в Москве.
PAGE.by
Служба бесплатного хостинга для белорусских интернет-проектов. Под белорусским понимается любой проект, основными посетителями которого будут жители Беларуси.
Plusweb
Центр Хостинга PlusWeb.ru. Так же занимается разработкой сйтов и программного обеспечения. В число предоставляемых тарифов виртуального хостинга входит бесплатный тариф HTML . Серверы размещены на технологических площадках РТКомм.
Sitecity.ru
Бесплатный хостинг с максимально упрощенной технологией создания сайтов предназначен для тех, кто не собирается вникать в технические детали и не желают тратить своё время на их изучение. Предполагает исключительное использование готовых шаблонов для построения сайтов.
Ucoz
Бесплатный хостинг со специальным конструктором сайтов различной сложности и функциональности на базе шаблонов.
Ukr Group
Ukr Group Ltd. Компания «Укр Груп» специализируется на предоставлении профессиональных услуг хостинга ваших сайтов в крупнейших Дата-центрах Европы. 39600, Полтавская обл., г. Кременчуг, ул. Воровского, дом 34, офис 25 (2-этаж)
Vline
Веб-хостинг ООО «Вилайн Телеком» (VLine Telecom). Помимо платного, предлагает возможность бесплатного хостинга веб-дизайнерам и компаниям, имеющим отношение к разработке веб-сайтов по предварительной заявке. Серверы установлены в дата-центрах г. Москвы: MMTC-9 и ЗАО «Корбина Телеком».
WallSt.ru
Бесплатный хостинг компании «ВебCервис Центр». Возможность использовать свои скрипты PHP, CGI, использовать mySQL базу данных.
WEBrise.ru
Бесплатный хостинг с PHP, MySQL предоставляется только перспективным проектам, уже зарекомендовавшим себя в сети. Предварительно оценивается насколько тематика и контент сайта подходят политике размещения хостера.
Webservis.ru
Бесплатный хостинг с PHP компании «ВебCервис Центр». Предоставляет также платный хостинг centre.ru.
xFES
ООО «Интернет-ресурс» Сервера в датацентре Многобайт (Москва), подключение к M9.
Бесплатный хостинг Украины
Мы не компания а группа альтруистов вебмастеров которые предлагают 5 GB дисковое пространство 100 GB передача данных Неограниченное количество доменов 5 аккаунтовFTP Бесплатный SSH Бесплатный конструктор сайтов Бесплатная 24/7/365 поддержка 99,9% гарантии Мгновенная установка счета 5 баз данных MySQL PHP 5.2.17 PhpMyAdmin 5 ящиков электронной почты (с возможностью подключить почту от Gmail или Яндекс. Почту Бесплатный веб-менеджер почты Бесплатная пересылка электронной почты Бесплатная панель управления Автоматическая установка сценариев Прямая защита Менеджер блокировок IP-адресов Пользовательские страницы ошибок Custom перенаправления Два файловых менеджера Менеджер индексирования папок Возможность зашиты файлов паролём Статистика трафика веб-сайта Функция импорта веб-сайта Функция импорта базы данных Бесплатный инструмент резервного копирования И ВСЕ ЭТО БЕСПЛАТНО И БЕЗ РЕКЛАМЫ!!!
Дата-центр «Барон Кнопп»
Центр обработки данных «Барон Кнопп» — это датацентр для самых требовательных клиентов, располагается на собственной площадке, в отдельно стоящем здании, в самом центре Москве. Благодаря современному проектированию и мощному инженерному обеспечению датацентр имеет высокую категорию надежности – TIER III и коэффициент готовности составляет 99,98%. Контроль над работой всех систем ЦОД осуществляется высококвалифицированной группой профессионалов. В дата-центре функционирует единая круглосуточная служба технической поддержки.
Хостингер
Hostinger предоставляет услуги бесплатного хостинга с 2007 года под брендом Hosting24 и является мировым лидером бесплатного хостинга.
Читайте также:  Value of type string is not suitable for value type numeric unsigned

Что вы выберете — решать вам. Я лично пользуюсь на данный момент бесплатным хостингом от Хостингера. Более подробно об этом провайдере я написал в статье «Бесплатный хостинг от Хостингера«.

Всем удачи и новых свершений!!!

Как выполнять php-скрипты в заданное время по расписанию

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

Подробности о работе cron и его использовании Вы найдете в отдельном документе. Здесь же мы опишем тонкости запуска таким образом именно PHP-скриптов.

На наших серверах установлен бинарный файл интерпретатора PHP, который можно вызывать из cron. Полный путь к нему — /usr/local/bin/php. В качестве параметра нужно передать полный путь до запускаемого PHP-скрипта. Пример задания для cron:

в случае с PHP 5 

0 1 * * * /usr/local/bin/php /home/uXXXXX/script.php

или в случае с PHP 4

0 1 * * * /usr/local/bin/php /home/uXXXXX/script.php

В данном примере скрипт, который находится на диске сервера и имеет полный путь /home/uXXXXX/script.php, запускается в 1 час ночи каждый день. Не забывайте нажимать Enter после каждой строки в cron — все строки в сценариях cron должны заканчиваться переводом строки или задание работать не будет.

Как изменить значение опций, имеющих статус изменяемости php_ini_perdir или php_ini_all

Вы можете изменить некоторые директивы PHP непосредственно в личном кабинете. Для этого перейдите в раздел «Услуги», выберите виртуальную площадку и нажмите на Вашем сайте, для которого нужно изменить настройки PHP. На странице с параметрами размещенного сайта найдите строку Конфигурация PHP и нажмите изменить, как показано на рисунке:

На открывшейся странице Вам будет доступен интерфейс управления некоторыми настройками PHP-интерпретатора:

Если нужной директивы со статусом изменяемости PHP_INI_PERDIR или PHP_INI_ALL нет в списке, Вы можете изменить ее с помощью управляющего файла .htaccess

В следующем примере мы изменим значение директивы mail.log, которая в качестве параметра принимает путь до файла, в который будут записываться все вызовы функции mail() при отправке писем скриптами сайта. Для этого воспользуемся файлом .htaccess, в который нужно добавить всего одну строчку.

php_value mail.log "/home/u12345/phpmail.log"

Теперь все вызовы функции mail() скриптами этого сайта будут записываться в файл phpmail.log в корне площадки u12345. Аналогичным образом можно менять и другие директивы, если их статус изменяемости соответствует PHP_INI_PERDIR или PHP_INI_ALL.

Напомним значение и расшифровку констант PHP_INI_*:

Список, описание и статус изменяемости директив можно найти в приложении G документации PHP.

Немного теории (структуры)

Далее рассмотрим структуру записи. Для понимания из чего состоит запись нужно понимать что из себя представляют Си подобные структуры и понимать их обозначения. Для тех кто не знает далее это будет кратко (но достаточно для понимания) описано. Описать постараюсь как можно проще, в детали углубляться тут нет смысла, да и боюсь что в деталях запутаюсь, главное чтобы было общее понимание.

Структуры представляют собой просто напросто набор байтов, и нотацию к ним позволяющую их интерпретировать. То есть у вас есть просто последовательность нулей и единиц, и в этой последовательности зашифрованы какие то данные, но пока у вас к этой последовательности нет аннотации то эти данные для вас не представляют никакой ценности, т.к. интерпретировать их вы не можете.

//допустим вам пришли такие данные
1101111000000010010110000010011100010000

Что тут видно, у нас есть некоторые биты, что это за биты мы понятия не имеем. Ну давайте попробуем например их разделить на байты и представить в десятичной системе

//получилось у нас 5 байт
11011110 00000010 01011000 00100111 00010000

//переведем в десятичную систему
222 2 88 39 16

Отлично мы интерпретировали их и получили какие то результаты, допустим что эти данные отвечают за то сколько определенная квартира должна за электроэнергию. Получается что в доме 222 квартира номер 2 должна заплатить 88 рублей. А что еще за две цифры, что с ними делать просто отбросить? Конечно нет! дело в том что мы не имели нотации (формата) которая подсказала бы нам как интерпретировать данные, и интерпретировали их по своему, в связи с этим получили не только бесполезный, но и вредный результат.

Теперь посмотрим как же мы должны были интерпретировать правильно эти данные, имея нотацию (формат). Далее буду называть вещи своими именами, а именно нотация = формат (вот тут форматы).

//формат следующий
"Cnn"

//расшифровка формата
//C - беззнаковый символ (char) (8 бит)
//n - беззнаковый short (16 бит)

//разобьем данные в соответствии с форматом
11011110 0000001001011000 0010011100010000

//переведем в десятичную систему
222 600 10000

Теперь все сходиться в доме №222 квартира 600 за электричество должна 1000 рублей Думаю теперь ясна важность формата, и теперь понятно как примерно выглядит условно Си подобная структура. (прошу обратить внимания, тут цель не детально объяснить что такое эти структуры, а дать общее понимание что это такое и как это работает)

Условное обозначение данной структуры будет такое

struct {
unsigned char houseNumber;
unsigned char flatNumperA1;
unsigned char flatNumperA2;
unsigned char summB1;
unsigned char summB2;
};

//одинаковые имена, с разными окончаниями означают что в них хранится одно значение
// houseNumber - дом
// flatNumperA1 && flatNumperA2 - квартира
// summB1 && summB2 - сумма долга

Ограничения

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

  • dl
  • shell_exec
  • exec
  • system
  • passthru
  • popen
  • proc_open
  • proc_nice
  • proc_get_status
  • proc_close
  • proc_terminate
  • posix_mkfifo
  • set_time_limit
  • chown
  • chgrp
  • accelerator_reset
  • opcache_reset
  • accelerator_get_status
  • opcache_get_status
  • pcntl_alarm
  • pcntl_fork
  • pcntl_waitpid
  • pcntl_wait
  • pcntl_wifexited
  • pcntl_wifstopped
  • pcntl_wifsignaled
  • pcntl_wexitstatus
  • pcntl_wtermsig
  • pcntl_wstopsig
  • pcntl_signal
  • pcntl_signal_dispatch
  • pcntl_get_last_error
  • pcntl_strerror
  • pcntl_sigprocmask
  • pcntl_sigwaitinfo
  • pcntl_sigtimedwait
  • pcntl_exec
  • pcntl_getpriority
  • pcntl_setpriority

Если на самом деле Вы хотите использовать функции вроде exec для выполнения периодических заданий вроде бэкапа баз MySQL, пожалуйста, используйте для этого

. Если же нужно разово выполнить какую-то команду, можно использовать для этого

В помощь вам мы приводим ссылки на полезные ресурсы по тематике PHP:

Отказоустойчивость


К сожалению, мир не идеален, случаются пожары, аплинки падают, ДЦ целиком уходят под воду, РКН блочит подсети, а люди совершают ошибки. Тем не менее, необходимо уметь обрабатывать такие ситуации и продолжать работать.

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

Как устанавливать скрипты? - Как создать сайт -
Суммарное кол-во загрузок виджета по каждой версии

Сбор ошибокJavaScript очень специфичный язык, и допустить в нем ошибку несложно. К тому же зоопарк браузеров в современном вебе очень большой; то, что работает в последнем Chrome, не факт, что будет работать в Safari или Firefox. Поэтому очень важно настроить сбор ошибок из браузера и вовремя реагировать на всплески.

Как устанавливать скрипты? - Как создать сайт -
Суммарное кол-ва ошибок со всех сайтов и браузеровКак устанавливать скрипты? - Как создать сайт -
Информация по конкретной ошибке

CDN FailoverВыше я уже писал, что все имеет свойство падать, поэтому важно обрабатывать эти ситуации и лучше — автоматически. Мы прошли несколько этапов фаллбека CDN-серверов, начинали с ручного, а в итоге нашли способ делать это автоматически и оптимально для браузера.

В ручном режиме это работало просто: админам приходило СМС о том что CDN прилег, они совершали определенные манипуляции, после чего виджет начинал загружаться с серверов приложения. Это могло занять от 5 минут до 2 часов времени.

Передача параметров окружения fcgi_params

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

Минимальные необходимые параметры окружения

$url = '/path/to/script.php'

$env = [
'REQUEST_METHOD' => 'GET',
'SCRIPT_FILENAME' => $url,
];

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

Структура пар имя значение будет такая

//для пар в которых значение имени и данных в менее 128 байт
typedef struct {
unsigned char nameLength;
unsigned char valueLength;
unsigned char nameData
unsigned char valueData;
};
//имя и значение кодируется 1 байтом

Идет сначала 1 байт — длинна имени, потом 1 байт значение

//для пар в которых значение имени и данных более 128 байт
typedef struct {
unsigned char nameLengthA1;
unsigned char nameLengthA2;
unsigned char nameLengthA3;
unsigned char nameLengthA4;
unsigned char valueLengthB1;
unsigned char valueLengthB2;
unsigned char valueLengthB3;
unsigned char valueLengthB4;
unsigned char nameData
unsigned char valueData;
};
//имя и значение кодируется 4 байтами

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

Закодируем наши переменные в соответствии форматом

$keyValueFcgiString = '';

foreach ($env as $key => $value) {
//длинна разных по длине значений кодируется по разному
//если меньше 128 байт то одним байтом если больше то четырьмя
$keyLen = strlen($key);
$lenKeyChar = $keyLen < 128 ? chr($keyLen) : pack('N', $keyLen);

$valLen = strlen($value);
$valLenChar = $valLen < 128 ? chr($valLen) : pack('N', $valLen);

$keyValueFcgiString .= $lenKeyChar . $valLenChar . $key . $value;
}

Тут значения меньше 128 бит кодируются функцией chr($keyLen), больше pack(‘N’, $valLen), где ‘N’ обозначает 4 байта. И затем все это слепляется в одну строку в соответствии с форматом структуры. Тело записи готово.

В заголовке записи передаем все то же самое как и в предыдущей записи, кроме типа (он будет FCGI_PARAMS = 4) и длинны данных (она будет равна длине пар имя => значение, или длине строки $keyValueFcgiString которую ранее мы сформировали).

//отправка заголовка
socket_write($socket, pack('CCnnCx', 1, 4, 1, strlen($keyValueFcgiString), 0));

//отправка body
socket_write($socket, $keyValueFcgiString);

//для перевода приложения в режим выполнения и отправки ответа посылаем еще одну запись
//с нулевым body
socket_write($socket, pack('CCnnCx', 1, 4, 1, 0, 0));

Пишем на php cli

Допустим, у вас есть компьютер с Windows. Вы можете открыть консоль и набрать там какие-нибудь команды. набрать dir и и получить список каталогов и файлов, скопировать файлы командой copy: copy c:a.txt d:b.txt

это консоль Windows. Если на вашем компьютере установлен php, вы можете открыть консоль, набрать что-нибудь вроде c:lampphpbinphp -i и увидеть настройки php.

Теперь представьте себе ваш хостинг. Операционная система, но не Windows, а Linux. Скорее всего у него нет графической оболочки. Единственный ваш способ общения с ним — через командную строку.

PHP CLI расшифровывается именно так: Command Line Interface. Интерфейс командной строки.

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

Заходите через ssh на ваш хост (ssh example_user@example.org), попадаете в консоль и запускаете php ваш_скрипт.php

главные отличия между php-cli и «php через браузер»:

1) php-cli выполняется с правами пользователя, который его запускает, php-через-браузер выполняется с правами «пользователя» веб-сервера.

2) Вы можете запустить что-нибудь в духе sudo php someFile.php и выполнить его с правами рута (самого главного пользователя в системе)

3) В php-cli по умолчанию нет ограничения по времени выполнения скрипта.

Если вы, допустим, подзабыли, как в принципе работает php — напомню. вашему серверу (apache, nginx) прилетает запрос — допустим на index.php — сервер посылает этот запрос демону php-fpm, который исполняет файл index.php, а результаты отправляет серверу, а сервер — вашему браузеру.

Это как если бы вам приходило письмо от друга с просьбой зайти в консоль, выполнить какой-то php-скрипт и прислать результат выполнения обратно.

Только гораздо быстрее.

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

Детали и настройки вы можете найти в мануале PHP.

Получение ответа fcgi_params

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

Получаем заголовок, он всегда равен 8 байт (получать данные будем по байту)

$buf = '';
$arrData = [];
$len = 8;

while ($len) {
socket_recv($socket, $buf, 1, MSG_WAITALL); //получаем данные по 1 байту и пишем их в массив
$arrData[] = $buf;
$len--;
}

//интерпретируем заголовок в соответствии с форматом 'CCnnCx'
$protocol = unpack('C', $arrData[0]);
$type = unpack('C', $arrData[1]);
$id = unpack('n', $arrData[2] . $arrData[3]);
$dataLen = unpack('n', $arrData[4] . $arrData[5])[1]; //длинна данных в ответе, их нам надо будет получить после заголовка (unpack возвращает массив, по этому там индекс)
$foo = unpack('C', $arrData[6]);

var_dump($dataLen); //сколько байт будет в теле ответа

Теперь в соответствии с полученной длинной тела ответа сделаем еще одно чтение из сокета

$buf2 = '';
$result = [];

while ($dataLen) {
socket_recv($socket, $buf2, 1, MSG_WAITALL);
$result[] = $buf2;
$dataLen--;
}

var_dump(implode('', $result)); //тут будет то что отдаст искомый скрипт

socket_close($socket);

Ура все сработало! Наконец то!Что мы имеем в ответе, если например в этом файле

$url = '/path/to/script.php' //переменная окружения которую задали ранее

мы пропишем

Справка и опции запуска php скриптов в командной строке

Справка содержит опции для разнообразных вариантов запуска файлов .php в командной строке, поэтому приведу её перевод полностью.


Использование:

   php [опции] [-f]  [--] [аргументы...]
   php [опции] -r  [--] [аргументы...]
   php [опции] [-B ] -R  [-E ] [--] [аргументы...]
   php [опции] [-B ] -F  [-E ] [--] [аргументы...]
   php [опции] -S : [-t docroot] [router]
   php [опции] -- [аргументы...]
   php [опции] -a

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

Опции:

  -a               Запустить интерактивный шелл (оболочку)
  -c <путь>|<файл> Искать файл php.ini в этой директории
  -n               Не будут использоваться конфигурационные (ini) файлы
  -d foo[=bar]     Установить INI запись для значения 'bar'
  -e               Сгенерировать расширенную информацию для отладчика/профайлера
  -f <файл>        Разобрать и выполнить <файл>.
  -h               Справка
  -i               Информация о PHP
  -l               Только проверка синтаксиса (lint)
  -m               Показать скомпилированные модули
  -r <code>        Запустить PHP <код> без использования тэгов скрипта <?..?>
  -B <начало_кода> Запустить PHP <начало_кода> перед обработкой строк ввода
  -R <код>         Запустить PHP <код> для каждой строки ввода
  -F <файл>        Разобрать и выполнить <файл> для каждой строки ввода
  -E <конец_кода>  Запустить PHP <конец_кода> после обработки всех строк ввода
  -H               Спрятать любые переданные аргументы от внешних инструментов.
  -S <адрес>:<порт> Запустить встроенный веб-сервер.
  -t <docroot>     Указать корневую папку документов <docroot> для встроенного веб-сервера.
  -s               Подсветка для HTML кода.
  -v               Номер версии
  -w               Вывести исходник с убранными комментариями и белыми пробелами.
  -z <файл>        Загрузить расширение Zend <файл>.

  args...          Передаваемые в скрипт аргументы. Используйте -- args когда первый аргумент
                   начинается с — или скрипт считывается с stdin (стандартного ввода)

  --ini            Показать имена конфигурационных файлов

  --rf <имя>      Показать информацию о функции <имя>.
  --rc <имя>      Показать информацию о классе <имя>.
  --re <имя>      Показать информацию о расширении <имя>.
  --rz <имя>      Показать информацию о расширении Zend <имя>.
  --ri <имя>      Показать конфигурацию для расширения <имя>.

Творческий поиск (ложный путь)

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

Суть его в следующем, я знаю что nginx (мы используем nginx и чтобы не писать далее дурацкое — web-сервер, буду писать nginx, так как то посимпатичнее) что то передает в php-fpm, это что то php-fpm обрабатывает и на основе него запускает скрипт, что ж вроде все просто, возьму да залогирую то что передает nginx и передам то же самое.

Тут поможет великолепный netcat (UNIX-утилита для работы с сетевым трафиком, которая по моему может практически все). Итак ставим netcat на прослушивание локального порта, а nginx настраиваем на работу с php файлами через сокет (естественно сокет на том же порту который слушает netcat)

слушаем 9000 порт

nc -l 9000

Проверить что все ок, можно обратившись через браузер на адрес 127.0.0.1:9000 должна быть следующая картина

Как устанавливать скрипты? - Как создать сайт -

настраиваем nginx чтобы он php скрипты обрабатывал через сокет на 9000 порту (в настройках ‘/etc/nginx/sites-available/default’, конечно могут отличаться)

location ~ .php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass 127.0.0.1:9000;
}

После этих манипуляций проверим что же получилось, обратившись к php скрипту через браузер

Как устанавливать скрипты? - Как создать сайт -

Видно что nginx отправил переменные окружения, а также непечатаемые символы, то есть данные были переданы в двоичной кодировке, а это значит что так просто их нельзя скопировать и послать в сокет php-fpm. Если сохранить их в файл например то они сохраняться в 16-ричной кодировке, выглядеть это будет примено так

Как устанавливать скрипты? - Как создать сайт -

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

Стало ясно что данный путь совершенно неверный, сами видите насколько все это убого выглядит, и тем более все эти действия не позволят нам управлять соединением, и ни как не приблизят к пониманию взаимодействия между php-fpm и nginx.

Все пропало, изучения спецификации не миновать!

Итоги

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

Полная версия скрипта
<?php

$url = '/path/to/script.php';
$env = [
'REQUEST_METHOD' => 'GET',
'SCRIPT_FILENAME' => $url,
];

$service_port = 9000;
$address = '127.0.0.1';

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

$result = socket_connect($socket, $address, $service_port);

//ОТКРЫТИЕ СОЕДИНЕНИЯ
//запрос на начало сессии с php-fpm
//параметры в пордке следования версия, тип записи (что эта запись будет делать), id запроса, длинна тела записи, длинна данных для выравнивания
socket_write($socket, pack('CCnnCx', 1, 1, 1, 8, 0));

//тело записи для открытия соединения
//параметры роль, флаг управляющий закрытыием соединения
socket_write($socket, pack('nCxxxxx', 1, 0));

$keyValueFcgiString = '';

foreach ($env as $key => $value) {
//длинна разных по длинне значений кодируется по разному
//если меньше 128 байт то одним байтом если больше то четырьмя
$keyLen = strlen($key);
$lenKeyChar = $keyLen < 128 ? chr($keyLen) : pack('N', $keyLen);

$valLen = strlen($value);
$valLenChar = $valLen < 128 ? chr($valLen) : pack('N', $valLen);

$keyValueFcgiString .= $lenKeyChar . $valLenChar . $key . $value;
}

//следующая запись, тут уже будем передавать в php-fpm параметры в каком окружении и какой скрипт мы хотим запустить
//из особенностей опишу параметры которые передаю
//1-версия (по старому), 4-тип записи (новое, означает передачу пар имя-значение FCGI_PARAMS), id запроса (тот же), длинна тела записи (длинна моих пар ключ-значение), длинна данных для выравнивания
socket_write($socket, pack('CCnnCx', 1, 4, 1, strlen($keyValueFcgiString), 0));

//отправляем пары ключ значение на сервер
socket_write($socket, $keyValueFcgiString);

//финишируем запрос
socket_write($socket, pack('CCnnCx', 1, 4, 1, 0, 0));

$buf = '';
$arrData = [];
$len = 8;

while ($len) {
socket_recv($socket, $buf, 1, MSG_WAITALL); //получаем данные по 1 байту и пишем их в массив
$arrData[] = $buf;
$len--;
}

//интерпритируем заголовок в соответствии с форматом 'CCnnCx'
$protocol = unpack('C', $arrData[0]);
$type = unpack('C', $arrData[1]);
$id = unpack('n', $arrData[2] . $arrData[3]);
$dataLen = unpack('n', $arrData[4] . $arrData[5])[1]; //длинна данных в ответе, их нам надо будет получить после заголовка (unpack возвращает массив, по этому там индекс)
$foo = unpack('C', $arrData[6]);

$buf2 = '';
$result = [];

while ($dataLen) {
socket_recv($socket, $buf2, 1, MSG_WAITALL);
$result[] = $buf2;
$dataLen--;
}

var_dump(implode('', $result)); //тут будет то что отдас искомый скрипт

socket_close($socket);

Вывод ошибок в php

Иногда возникает необходимость получить информацию о том, какие ошибки возникают при выполнении PHP-скриптов. При использовании PHP как модуля Apache (по умолчанию именно так) вывод ошибок доступен в личном кабинете в меню Услуги, выбрав виртуальную площадку, где размещен сайт, затем Домен в списке сайтов, далее в параметрах Журнал регистрации ошибок: > error_log.

Иногда имеет смысл включить вывод ошибок PHP-скриптов на экран. Возможно 2 случая:

Если Вы используйте PHP-интерпретатор как модуль Apache, создайте в той директории, где находятся скрипты, файл .htaccess (если он не существует) и добавьте 2 строки, одна из которых включает вывод ошибок в браузер, а вторая определяет уровень отображаемых ошибок:

php_flag display_errors on
php_value error_reporting 2047

Число 2047 является значением константы E_ALL и включает вывод всех типов ошибок. Значение константы E_ALL зависит от версии PHP. Точное значение можно узнать на сайте разработчика.

Если Вы используете PHP-интерпретатор как CGI, то для вывода ошибок следует в файле настроек для PHP, изменить значение параметра

display_errors = Off
display_errors = On

Кроме этого, надо изменить значение параметра error_reporting со значения E_ALL & E_NOTICE на простое E_ALL (по желанию).

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

Оцените статью
Хостинги