在C中使用pthread调用php函数

用户名

我需要对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模式-但是,重要的是要意识到所使用的内存模型不共享任何内容。

在没有共享的模型中,每个线程都有一个不同的解释器(编译器,执行器,所有模块全局变量,所有用户代码,全部)。

这意味着各种事情:

  • 线程B无法执行为线程A编译的代码。线程B必须从线程A复制代码,执行类似的操作pass_two并执行代码的副本。
  • 如果没有适当的准备和/或适当的对象处理程序,从(引用)线程A复制的引用对象,资源或哈希表的代码可能会中断。

仅仅启动一个线程并尝试调用Zend注定会失败,因为它忽略了PHP的无共享特性。

新线程的流程必须类似于:

void routine(void *thing) {
    ts_resource(0);

    php_request_startup();

    /* do stuff */

    php_request_shutdown();

    ts_free_thread();
}
  • ts_resource:这将在新线程中初始化TSRM,进而初始化一些Zend
  • php_request_startup:初始化其余所有内容,并RINIT为所有模块运行其他内容
  • php_request_shutdown:运行RSHUTDOWN,一般清理
  • ts_free_thread:可选(免费),否则将在进程关闭时发生(最终关闭TSRM时)

照原样,如果示例流程尝试调用由另一个线程编译的用户代码,则该流程也将失败:在请求启动之后和调用用户代码之前,您需要先将代码复制到当前上下文中。

在pthreads扩展源中可以找到有关任何这些在现实世界中如何工作的详细信息。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在PHP中使用SoapClient调用远程函数

来自分类Dev

在pthread_create中使用仿函数

来自分类Dev

c-在函数调用中使用从函数返回的指针

来自分类Dev

c-在函数调用中使用从函数返回的指针

来自分类Dev

在PHP中使用pthread进行后台处理

来自分类Dev

如何告诉PHP在函数调用中使用默认参数?

来自分类Dev

如何在php对象stdClass中使用参数调用函数?

来自分类Dev

在C / C ++中使用其地址调用lua函数吗?

来自分类Dev

在C中使用互斥锁同步pthread

来自分类Dev

在Cmake中使用C中的pthread lib

来自分类Dev

在C中使用互斥锁同步pthread

来自分类Dev

从Fortran中使用** int参数调用C函数

来自分类Dev

C#在函数调用中使用类的返回值

来自分类Dev

在C中的函数调用中使用预递增是错误的吗?

来自分类Dev

如何在C#中使用构造函数调用方法?

来自分类Dev

如何在C中使用结构调用函数?

来自分类Dev

在MATLAB中使用@()调用函数

来自分类Dev

使用带有char指针的函数调用pthread_create

来自分类Dev

使用pthread_create从线程调用类成员函数

来自分类Dev

c# - 如何在c#中的非异步函数中使用await调用异步函数?

来自分类Dev

c ++在函数中使用函数

来自分类Dev

在C ++中使用了pthread_create的参数—每次线程函数获取值都相同,为什么呢?

来自分类Dev

在 java 或 c++ 中使用“按名称调用”调用此函数的结果和示例是什么?

来自分类Dev

使用JavaScript调用php函数

来自分类Dev

使用php调用javascript函数

来自分类Dev

使用PHP调用Javascript函数

来自分类Dev

在PHP中使用匿名函数

来自分类Dev

在函数php中使用goto

来自分类Dev

在树枝中使用php函数

Related 相关文章

热门标签

归档