|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2016-02-15 09:38 UTC] maroszek at gmx dot net
Description:
------------
Description:
------------
PHP 7 is current stable (Also reproducable with 5.6.18)
PHP 7 is used as Embed (Also reproducable with 5.6.18)
Visual Studio 2013
I build a simple example to demonstrate the threading problem.
It crashes nearly instatly. Running only one thread works fine.
Expected result:
----------------
No crash. Endless loop doing the work.
Actual result:
--------------
Crash. I attached a backtrace which shows the concurrent access to setlocale which causes the crash
Test script:
---------------
#include <stdio.h>
#include <iostream>
#include <thread>
#include <main/php.h>
#include <main/SAPI.h>
#include <main/php_main.h>
#include <main/php_variables.h>
#include <main/php_ini.h>
#include <zend_ini.h>
#ifdef ZTS
ZEND_TSRMLS_CACHE_EXTERN();
#endif
zend_module_entry ips_module_entry = {
STANDARD_MODULE_HEADER,
"XYZ",
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NO_VERSION_YET,
STANDARD_MODULE_PROPERTIES
};
static size_t php_embed_read_post(char *str, size_t str_length)
{
return 0;
}
static char* php_embed_read_cookies()
{
return NULL;
}
static size_t php_embed_ub_write(const char *str, size_t str_length)
{
std::cout << str;
return str_length;
}
static void php_embed_flush(void *server_context)
{
//
}
static void php_embed_send_header(sapi_header_struct *sapi_header, void *server_context)
{
//
}
static void php_embed_log_message(char *message)
{
fprintf(stderr, "%s\n", message);
}
static void php_embed_register_variables(zval *track_vars_array)
{
//
}
static int php_embed_startup(sapi_module_struct *sapi_module)
{
if (php_module_startup(sapi_module, NULL, 0) == FAILURE) {
return FAILURE;
}
return SUCCESS;
}
sapi_module_struct php_embed_module = {
"XYZ", /* name */
"PHP for XYZ", /* pretty name */
php_embed_startup, /* startup */
php_module_shutdown_wrapper, /* shutdown */
NULL, /* activate */
NULL, /* deactivate */
php_embed_ub_write, /* unbuffered write */
php_embed_flush, /* flush */
NULL, /* get uid */
NULL, /* getenv */
php_error, /* error handler */
NULL, /* header handler */
NULL, /* send headers handler */
php_embed_send_header, /* send header handler */
php_embed_read_post, /* read POST data */
php_embed_read_cookies, /* read Cookies */
php_embed_register_variables, /* register server variables */
php_embed_log_message, /* Log message */
NULL, /* Get request time */
NULL, /* Child terminate */
STANDARD_SAPI_MODULE_PROPERTIES
};
int main(int argc, const char * argv[]) {
tsrm_startup(128, 1, 0, NULL);
sapi_startup(&php_embed_module);
php_embed_module.ini_entries = "date.timezone=Europe/Berlin\n\0";
if (php_embed_module.startup(&php_embed_module) == FAILURE) {
throw std::runtime_error("Could not start PHP!");
}
for (int i = 0; i < 10; i++) {
std::thread([&argv]{
ts_resource(0);
while (true){
zend_file_handle file_handle;
file_handle.type = ZEND_HANDLE_FILENAME;
file_handle.filename = "date.php";
file_handle.handle.fp = NULL;
file_handle.opened_path = NULL;
file_handle.free_filename = 0;
if (php_request_startup() == FAILURE) {
//std::cout << "ERR" << std::endl;
php_request_shutdown(NULL);
continue;
}
if (php_execute_script(&file_handle) == FAILURE)
break;
//std::cout << "RUN" << std::endl;
php_request_shutdown(NULL);
}
std::cout << "DIED" << std::endl;
}).detach();
}
while (true);
return 0;
}
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Sat Oct 25 22:00:01 2025 UTC |
I have another upcoming ZTS bugreport :) and thanks for your time and effort! std::thread seems to properly use beginthread. Nevertheless i updated the example just to be sure. And i linked to threadlocale.obj to ensure that locales for each thread are enabled. I also compiled the PHP7 example with Visual Studio 2015 Update 1. The error remains :) Can you have a look if you can reproduce it aswell? Updated Example: unsigned __stdcall phpThread(void* params) { ts_resource(0); while (true) { zend_file_handle file_handle; file_handle.type = ZEND_HANDLE_FILENAME; file_handle.filename = "date.php"; file_handle.handle.fp = NULL; file_handle.opened_path = NULL; file_handle.free_filename = 0; if (php_request_startup(TSRMLS_C) == FAILURE) { //std::cout << "ERR" << std::endl; php_request_shutdown(NULL); continue; } if (php_execute_script(&file_handle TSRMLS_CC) == FAILURE) break; //std::cout << "RUN" << std::endl; php_request_shutdown(NULL); } std::cout << "DIED" << std::endl; return 0; } int main(int argc, const char * argv[]) { tsrm_startup(128, 1, 0, NULL); sapi_startup(&php_embed_module); php_embed_module.ini_entries = "date.timezone=Europe/Berlin\n\0"; if (php_embed_module.startup(&php_embed_module) == FAILURE) { throw std::runtime_error("Could not start PHP!"); } for (int i = 0; i < 10; i++) { _beginthreadex(NULL, 0, phpThread, NULL, 0, NULL); //std::thread([]{phpThread(NULL);}).detach(); } while (true); return 0; }I used your latest variant and have some crash, too. But it's not about set locale > php7ts.dll!zend_hash_graceful_reverse_destroy(_zend_array * ht=0x0000020f71c909a0) Line 1489 C php7ts.dll!shutdown_executor() Line 278 C php7ts.dll!zend_deactivate() Line 969 C php7ts.dll!php_request_shutdown(void * dummy=0x0000000000000000) Line 1826 C bug71596.exe!phpThread(void * params=0x0000000000000000) Line 130 C++ bug71596.exe!thread_start<unsigned int (__cdecl*)(void * __ptr64)>(void * const parameter=0x00007ff621d579c4) Line 115 C++ It's incomplete yet, have to recompile a debug build to get more info on that. It currently shows a crash while destroying the symbol table on some RSHUTDOWN. This might or might not be related to your locale crash. Btw, what is the content of your date.php, i was just putting some date("i"); in there from what i saw in your bt. Thanks.In my first comment i have attached a full project, if that helps. Contents of date.php: <? //ini_set( 'date.timezone', 'Europe/Berlin' ); //date_default_timezone_set( 'Europe/Berlin' ); date("Ymd");