Вызов функций php с использованием pthread в C

1

Мне нужно многопоточную функцию 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");
}

Вопрос
Это проблема с потоками? как мне это исправить?

  • 0
    Я бы посоветовал сначала удалить все влияния браузера и вместо этого использовать CLI SAPI. Также неясно, как это относится к коду C. Обратите внимание, что pthreads в PHP - это нечто иное, чем pthreads в C (потоки POXIX).
  • 0
    "Pthreads" в PHP написан в pthreads на языке C с использованием библиотеки <pthead.h> в POXIX, и это то, чего я пытаюсь достичь самостоятельно.
Показать ещё 2 комментария
Теги:
multithreading
thread-safety
pthreads

1 ответ

1
Лучший ответ

PHP может быть построен для поддержки многопоточного режима SAPI - ZTS, однако важно понять, что используемая модель памяти не использует ничего.

В общей модели ничего нет, каждый поток имеет другой интерпретатор (компилятор, исполнитель, все глобальные модули, весь код пользователя, весь лот).

Это означает разные вещи:

  • Код, скомпилированный для потока A, не может быть выполнен потоком B. Thread 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.

  • 0
    Спасибо Джо, ваш ответ очень ценится!
  • 0
    Я получил это предупреждение и ошибку. Я использую компилятор clang, я должен установить gcc? ----------- / Users / имя пользователя / терминал / src / php / ext / pthread / php_pthread.c: 30: 5: предупреждение: неявное объявление функция 'php_request_shutdown' недопустима в C99 [-Wimplicit-function-объявление] php_request_shutdown (); ^ /Users/username/terminal/src/php/ext/pthread/php_pthread.c:32:20: ошибка: слишком много аргументов для вызова функции, ожидается 0, есть 1 ts_free_thread (0);
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню