Array ( [SITE_NAME] => aleksandr.ru [HTTP_BASE] => http://aleksandr.ru/ [TITLE] => Отфильтрованные посты [KEYWORDS] => [DESCRIPTION] => [post] => Array ( [0] => Array ( [html] =>

Получая данные из unix консоли, в результате exec() и других вызовов, не латинские символы обычно экранируются с помощью \x##, где ## - это шестнадцатеричный код символа, но совсем не UTF8.

Например при получении текста сертификата средствами OpenSSL вместо русских будет что-то вроде этого:

C=RU, L=\xD0\x9C\xD0\xBE\xD1\x81\xD0\xBA\xD0\xB2\xD0\xB0,

Для того чтоб перевести это к читаемому виду в в консоли надо сделать:

<ваша команда> | sed 's@+@ @g;s@%@\\x@g' | xargs -0 printf '%b'

А для PHP вот такой код (на всякий случай, перед x стоит 4 обратных слеша):

preg_replace_callback('/\\\\x([0-9A-F]{2})/', function($a){ return pack('H*', $a[1]); }, $your_string);

В результате получаем русский текст:

C=RU, L=Москва,
[prev_id] => 0 [tags] => Array ( [0] => Array ( [tag_id] => 3 [name] => Про работу ) [1] => Array ( [tag_id] => 10 [name] => PHP ) [2] => Array ( [tag_id] => 12 [name] => Linux ) ) [route_id] => 264 [title] => Декодируем \x## последовательности в строке [description] => Получая данные из unix консоли, в результате exec() и других вызовов, не латинские символы обычно экранируются с помощью \x##, где ## - это шестнадцатеричный код символа, но совсем не UTF8. Например при получении текста сертификата средствами OpenSSL... [dt] => 2017-06-30 17:49:00 [is_hidden] => [image] => [comments] => 0 [rate] => 0 [HREF] => /blog/dekodiruem__x___posledovatelnosti_v_stroke ) [1] => Array ( [html] =>

Fake Sendmail code

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

[prev_id] => 0 [tags] => Array ( [0] => Array ( [tag_id] => 10 [name] => PHP ) [1] => Array ( [tag_id] => 12 [name] => Linux ) ) [route_id] => 260 [title] => Фиктивный sendmail для Linux [description] => Часто разработчикам требуется отправлять письма так, чтоб они никуда не уходили, а просто складывались в файловую систему для того чтоб можно было посмотреть что отправилось. Ровно для этих целей предлагается этот маленький скрипт. [dt] => 2017-04-20 19:00:04 [is_hidden] => [image] => /sitefiles/260/fake_sendmail.png [comments] => 0 [rate] => 0 [HREF] => /blog/fiktivniy_sendmail_dlya_linux [more] => Array ( [href] => /blog/fiktivniy_sendmail_dlya_linux [title] => Фиктивный sendmail для Linux ) ) [2] => Array ( [html] =>

PostreSQL

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

Postgres.app

Это действительно самый простой способ запустить PostgreSQL на MacOS. Качаем с официального сайта интересующую нас версию, перемещаем в приложения и просто запускаем. И вот, у нас есть работающий PostgreSQL. Для себя я выбрал версию 9.3, как оптимальное соотношение распространенности и размера файла.

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

PHP pgsql

[prev_id] => 0 [tags] => Array ( [0] => Array ( [tag_id] => 10 [name] => PHP ) [1] => Array ( [tag_id] => 46 [name] => Mac OS ) [2] => Array ( [tag_id] => 52 [name] => PostgreSQL ) ) [route_id] => 258 [title] => PHP PostgreSQL на MacOS [description] => В общем и целом все не сложно, если знать как. Для того чтобы знать, попробую описать как на MacOS запустить PostreSQL и установить расширение php-pgsql. Postgres.app Это действительно самый простой способ запустить PostgreSQL на MacOS. Качаем с... [dt] => 2017-03-17 23:38:05 [is_hidden] => [image] => /sitefiles/258/netsuke.png [comments] => 0 [rate] => 0 [HREF] => /blog/php_postgresql_na_macos [more] => Array ( [href] => /blog/php_postgresql_na_macos [title] => PHP PostgreSQL на MacOS ) ) [3] => Array ( [html] =>

PHP-FPM

Достаточно часто встречается связка Nginx + PHP-FPM, которая заменяет собой привычный многим Apache + mod_php. А когда требуется добавить возможность работать с Oracle из PHP, то не подготовленный человек, а точнее привычный к настройке Oracle Client для PHP, работающего как модуль Apache, может столкнуться с непредвиденными проблемами, о решении которых я попробую рассказать.

Итак, у нас CentOS (в принципе на других Linux все будет аналогично) на который уже установлен Nginx, PHP, PHP-FPM и Oarcle Client + модуль php_oci8. На всякий случай, в этом можно убедиться командой:

# php -m | grep oci

Если вывод такой же, как в примере ниже, то модуль установлен:

# php -m | grep oci
oci8

А вот если, там ругань об отсутствующей библиотеке вроде:

PHP Startup: Unable to load dynamic library 'oci8.so' (tried: /usr/lib/php/20170718/oci8.so (libmql1.so: cannot open shared object file: No such file or directory), /usr/lib/php/20170718/oci8.so.so (/usr/lib/php/20170718/oci8.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0

То надо сделать (замените путь из примера на свой):

# echo /u01/app/oracle/product/12.1.02/db_1/lib > /etc/ld.so.conf.d/oracle.conf
# ldconfig

* в случае Oracle Instant Client путь будет до папки клиента, например /opt/oracle/instantclient_12_2.

Теперь модуль должен нормально заработать в консольном режиме.

Но после этого все равно при попытке использовать oci_connect(...) получаем вот такую ошибку в ответе от сервера:

Warning: oci_connect(): OCIEnvNlsCreate() failed. There is something wrong with your system - please check that ORACLE_HOME and LD_LIBRARY_PATH are set and point to the right directories in /var/www/...

Когда все известные бубны с прописыванием ORACLE_HOME и LD_LIBRARY_PATH во все скрипты запуска и прочие перебраны, но все равно не работает, то простое решение кажется просто невозможным, но оно есть!

[prev_id] => 168 [tags] => Array ( [0] => Array ( [tag_id] => 10 [name] => PHP ) [1] => Array ( [tag_id] => 11 [name] => Oracle ) [2] => Array ( [tag_id] => 12 [name] => Linux ) ) [route_id] => 250 [title] => Oracle Client вместе с PHP-FPM [description] => Достаточно часто встречается связка Nginx + PHP-FPM, которая заменяет собой привычный многим Apache + mod_php. А когда требуется добавить возможность работать с Oracle из PHP, то не подготовленный человек, а точнее привычный к настройке Oracle Client... [dt] => 2016-09-02 15:12:03 [is_hidden] => [image] => /sitefiles/250/PHP-FPM.jpg [comments] => 0 [rate] => 0 [HREF] => /blog/oracle_client_vmeste_s_php_fpm [more] => Array ( [href] => /blog/oracle_client_vmeste_s_php_fpm [title] => Oracle Client вместе с PHP-FPM ) ) [4] => Array ( [html] =>

PHP Code

Вашему внимаю предлагается жвачка для ума для любителей true-кодинга на PHP.

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

Итак, задача казалось бы вполне тривиальная и очень типичная:

Получить в переменную $id значение параметра id из GET, при условии, что это цифра и больше 0, в остальных случаях - FALSE.

И это бы было тривиально, если бы не следующие ограничения:

Запись должна быть в одну строку $id = ...; (точку с запятой можно поставить только один раз в конце строки), а операторы 'if' и '?', а также фигурные скобки использовать нельзя. Обращаться к массивам $_* нельзя.

Тест-кейс который должен выполняться:

index.php?id=100500  => 100500
index.php?id=-10     => FALSE
index.php?id=0       => FALSE
index.php?id=        => FALSE
index.php?id=wtf     => FALSE
index.php?           => FALSE

Ну что ж, давайте рассуждать как это сделать.

[prev_id] => 0 [tags] => Array ( [0] => Array ( [tag_id] => 10 [name] => PHP ) ) [route_id] => 249 [title] => Вопрос для любителей ПеХеПе [description] => Вашему внимаю предлагается жвачка для ума для любителей true-кодинга на PHP. Этот вопрос хорошо подходит для того, чтобы задавать на собеседовании и замучить кандидата до смерти, тк сразу и без подготовки на него ответят далеко не все, а только те... [dt] => 2016-08-11 16:36:34 [is_hidden] => [image] => /sitefiles/249/php_filter.png [comments] => 1 [rate] => 0 [HREF] => /blog/vopros_dlya_lyubiteley_pehepe [more] => Array ( [href] => /blog/vopros_dlya_lyubiteley_pehepe [title] => Вопрос для любителей ПеХеПе ) ) ) [PAGINATION] =>

)