Мне нужно многопоточную функцию php, но когда я вызываю функцию php, я получаю эту ошибку "Safari Cant Open the Page" Safari cant open the page "localhost/home.php" because the server unexpectedly dropped the connection. This sometimes occurs when the server is busy. Wait for a few minutes, and then try again.
Safari cant open the page "localhost/home.php" because the server unexpectedly dropped the connection. This sometimes occurs when the server is busy. Wait for a few minutes, and then try again.
У меня эти строки в файле php
<?php
echo "Hello World","<br>";
open_thread("hello");
function hello() {
echo "Hello World";
}
Когда я open_thread("hello");
hello
от open_thread("hello");
, он просто выводит это предупреждение: Warning: open_thread() expects exactly 1 parameter, 0 given in/Users/username/Sites/home.php on line 3
Это также происходит, когда я вызываю функцию C, которая имеет в ней выход, когда я удаляю выходы из функционального сервера и ничего не отображает.
Проблема возникает здесь pthread_join(tid, NULL);
Вот мои коды C
PHP_FUNCTION(open_thread)
{
zval *threaded_func;
zend_string *func_name;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &threaded_func) != SUCCESS) {
return;
}
if (Z_TYPE_P(threaded_func) != IS_NULL)
{
if (!zend_is_callable(threaded_func, 0, &func_name TSRMLS_CC))
{
php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s is not a valid read callback", func_name);
efree(func_name);
RETURN_FALSE;
}
efree(func_name);
}
pthread_t tid;
zend_printf("Starting..\n");
pthread_create(&tid, NULL, (void *) threaded_func, NULL);
pthread_join(tid, NULL);
zend_printf("Finished\n");
}
Вопрос
Это проблема с потоками? как мне это исправить?
PHP может быть построен для поддержки многопоточного режима SAPI - ZTS, однако важно понять, что используемая модель памяти не использует ничего.
В общей модели ничего нет, каждый поток имеет другой интерпретатор (компилятор, исполнитель, все глобальные модули, весь код пользователя, весь лот).
Это означает разные вещи:
pass_two
и выполнить копию кода.Просто запуск потока и попытка вызова в Zend обречены на провал, поскольку он игнорирует общий характер PHP.
Поток новых потоков должен быть примерно таким:
void routine(void *thing) {
ts_resource(0);
php_request_startup();
/* do stuff */
php_request_shutdown();
ts_free_thread();
}
ts_resource
: это инициализирует TSRM в новом потоке, в свою очередь инициализируя некоторые из Zendphp_request_startup
: инициализирует остальную часть всего, в том числе запускает RINIT
для всех модулейphp_request_shutdown
: это запускает RSHUTDOWN
, обычно очищаетts_free_thread
: необязательно бесплатный, в противном случае произошел бы при завершении процесса (когда TSRM окончательно завершает работу)Как и в случае, поток примера также потерпит неудачу, если он попытается вызвать код пользователя, скомпилированный (для) другим потоком: после запуска запроса и прежде, чем вы сможете вызвать код пользователя, вам нужно сначала скопировать код в текущий контекст.
Подробные сведения о том, как это работает в реальном мире, можно найти в источниках расширения pthreads.