#php #php-extension #php-8
#php #php-расширением #php-8
Вопрос:
У меня есть модуль php, который создан для php7, и я думаю, что php5 тоже, но в php8.0, когда я пытаюсь запустить make
, я получаю длинный список с ошибками, потому что TSRMLS_CC устарел.
Отображаемые ошибки выглядят так:
/home/appie/Downloads/php-sweph/sweph.c: In function ‘zif_swe_calc_ut’:
/home/appie/Downloads/php-sweph/sweph.c:512:44: error: expected ‘)’ before ‘TSRMLS_CC’
512 | if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "dll",
| ^~~~~~~~~
/home/appie/Downloads/php-sweph/sweph.c:512:6: error: too few arguments to function ‘zend_parse_parameters’
512 | if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "dll",
У меня есть много функций, которые используют этот TSRMLS_CC, и все они выглядят так:
PHP_FUNCTION(swe_calc_ut)
{
char *arg = NULL;
int rc;
long ipl, iflag;
double tjd_ut, xx[6];
char serr[AS_MAXCH];
int i;
if(ZEND_NUM_ARGS() != 3) WRONG_PARAM_COUNT;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "dll",
amp;tjd_ut, amp;ipl, amp;iflag) == FAILURE) {
return;
}
rc = swe_calc_ut(tjd_ut, (int)ipl, (int)iflag, xx, serr);
/* create an array */
array_init(return_value);
for(i = 0; i < 6; i )
add_index_double(return_value, i, xx[i]);
add_assoc_string(return_value, "serr", serr);
add_assoc_long(return_value, "rc", rc);
}
Моей первой мыслью было, что произойдет, если я удалю TSRMLS_CC. После удаления компиляция была завершена, и я смог установить модуль в apache. В основном модуль теперь работает без проблем, но в журнале apache2. Я получаю длинный список предупреждений от всех функций, которые используют TSRMLS_CC.
Они выглядят как:
PHP Warning: Missing arginfo for swe_calc() in Unknown on line 0
PHP Warning: Missing arginfo for swe_calc_ut() in Unknown on line 0
PHP Warning: Missing arginfo for swe_fixstar() in Unknown on line 0
Как мне избавиться от предупреждений, есть ли альтернатива для TSRMLS_CC? Я пытаюсь это понять, но пока не смог ее решить.
Ответ №1:
Краткое изложение изменений во внутренних компонентах всегда можно найти в ОБНОВЛЕНИИ.ВНУТРЕННИМ файлом в исходном коде PHP.
Два изменения, с которыми вы столкнулись, не связаны:
TSRMLS_CC
был частью потокобезопасного менеджера ресурсов, реализации локального хранилища потоков, используемого для сборки PHP для многопоточных сред. Он был удален, потому что существуют более новые механизмы, позволяющие делать то же самое гораздо более прозрачно. Вы можете безопасно удалить все виды использованияTSRMLS_*
из своего расширения, если вам не нужно сохранять поддержку PHP 5.arginfo
— это информация об именах и типах параметров функции, которая используется для отражения. Раньше это было необязательно, но теперь требуется, отчасти для того, чтобы все функции можно было вызывать с новым синтаксисом именованных параметров. Самый простой способ его создания — написать «заглушки» определений PHP — пустые функции PHP с правильной сигнатурой, но без реализации, похожие на то, что вы могли бы определить для автоматического завершения работы в IDE. Затем вы можете передать этот PHP-файл в gen-stub.php сценарий. Именно такarginfo
теперь управляется для всех связанных расширений PHP, так что вы можете найти множество примеров, если посмотрите исходный код, в том числе в расширении skeleton.
Комментарии:
1. Как написать определения php-заглушки и как использовать / запускать gen-stub.php сценарий?
2. @Arjan Смотрите Обновленный ответ. Я думаю, что скрипт просто принимает имя файла или каталога для обработки в качестве параметра командной строки.
3. @NikiC Спасибо за редактирование. Дайте мне знать, если я ошибся в каких-либо деталях! 🙂