我需要对PHP函数进行多线程处理,但是当我调用php函数时,出现此错误“ Safari无法打开页面” Safari can’t 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";
}
当我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扩展源中可以找到有关任何这些在现实世界中如何工作的详细信息。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句