PHP FFI
В ПХП 7.4 предпринята очередная попытка обзавестись интерфейсом к языку Си. Кажется наконец за это расширение взялись
Для интереса посмотрел что за АПИ получилось. В принципе, всё очень просто. Вот как выглядит
/**
* @method object mkdtemp(string $template)
* @method object strerror(int $errnum)
* @property-read int $errno
*/
$ffi = FFI::cdef('
// Импортируем функцию создания временного директория
char *mkdtemp(char *template);
// Импортируем функцию перевода кодов ошибок в строку
char *strerror(int errnum);
// Импортируем переменную, хранящую коды ошибок
int errno;
');
/**
* Фунция для создания временных директориев по маске
* @param string $template Шаблон создания (см. man mkdtemp)
* @return string Путь до временного директория
*/
$mkdtemp = function (string $template) use ($ffi): string {
$result = $ffi->mkdtemp($template);
if ($result === null) {
$errno = $ffi->errno;
$errstr = $ffi->strerror($errno);
throw new RuntimeException(FFI::string($errstr), $errno);
}
return FFI::string($result);
};Как можно понять из кода, создаётся объект, в который импортируются сущности, перечисленные в сишной нотации в первом параметре. В общем случае вторым параметром требуется указать библиотеку для импорта, но в данном случае работает и так.
Не знаю заработает ли этот код без изменений под Линуксом и Виндоузом, у кого есть под рукой, посмотрите, пожалуйста.
В этом примере параметры в импортированные функции передаются как обычные типы ПХП, а некоторые возвращаемые значения требуют конвертации. Так char * возвращается как специальный объект, который нужно преобразовывать в строку вызовом метода FFI::string.
Вот тривиальный текстовый пример использования созданной выше функции:
$template = implode(DIRECTORY_SEPARATOR, [sys_get_temp_dir(), 'ffiphp.XXXXXX']);
try {
$tmp = $mkdtemp($template);
rmdir($tmp);
echo $tmp, "\n";
} catch (RuntimeException $e) {
echo $e->getMessage(), "\n";
}Суть происходящего проста: если директорий удалось создать, то он будет уничтожен, а его имя — выведено на экран, иначе появится текстовое сообщение об ошибке.
19 февраля 1908 года
Продолжаю разбирать находки с чердаков.
Одна из вещей, найденных там, — несколько листков отрывного календаря за 1908 год. Было очень соблазнительно выкладывать по листку в соответствующие даты, но слишком долго ждать, поэтому буду постепенно выкладывать безо всякой системы.
Анекдот меня не впечатлил, а вот «меню» — да. Как я понимаю, это это идеи того, чем можно было бы побаловать гостей в этот день:
Супъ изъ сушеныхъ вишень.
Рыба жареная.
Суфле изъ муки.
Бросился в глаза «суп из сушеных вишен» — очень необычное блюдо, как по мне, никогда о таком не слышал. Я подумал что это в правду
Коронавирус и рукопожатие
Через несколько дней мы собирались лететь в отпуск в Китай,
Весь этот инфошум здо́рово давит на психику и, чтобы понимать реальное положение дел, мне лучшим подспорьем показался канал доктора Комаровского, где он регулярно и популярно рассказывает о том, что известно на текущий момент.
В своём последнем видео доктор призвал тщательно мыть руки, чихать в локтевой сгиб и перестать здороваться за руку со всеми подряд — этой рукой мы потом трём нос и это, по утверждению Комаровского, есть основной канал распространения вируса гриппа.
Я тут подумал, что это хорошо подтверждается статистикой. В основном за руку здороваются мужчины, и 71% заболевших — тоже мужчины. В этом есть даже
Дополнение: рухнула моя теория, друг в комментариях в «Фейсбуке» утверждает, что в азиатских культурах рукопожатие не принято (он живёт в Сингапуре).