thread safe php make ffi callback error(ext ffi)
Ouverte
Personne n'a encore pris cette issue.
Bug
Extension: ffi
Status: Needs Triage
- Langage dominant
- C
- Étoiles
- 40.4k
- Forks
- 8.2k
- Merge moyen
- 2 j 13 h
- PR mergées (30 j)
- 96
Description
Description
<?php
$ffi = FFI::cdef("
typedef void (*log_message_callback_t)(int level, const char* msg);
int test_start_str(const char* oldP, int id, log_message_callback_t log_callback);
", "test_lib.dll");
$log_callback = function($level, $msg) {
echo "Log (level $level): " . $msg . "\n";
};
$result = $ffi->test_start_str("example_parameter", 42, $log_callback);
echo "Result: $result\n";
this is the c code
#include <stdio.h>
#include <pthread.h>
#ifdef _WIN32
#define DLL_EXPORT __declspec(dllexport)
#else
#define DLL_EXPORT
#endif
typedef void (*log_message_callback_t)(int level, const char* msg);
typedef struct {
const char* oldP;
log_message_callback_t log_callback;
} thread_data_t;
void* thread_function(void* arg) {
thread_data_t* data = (thread_data_t*) arg;
const char* oldP = data->oldP;
log_message_callback_t log_callback = data->log_callback;
char message[256];
snprintf(message, sizeof(message), "Thread running with parameter %s", oldP);
if (log_callback) {
log_callback(1, message);
} else {
fprintf(stderr, "Log callback not set in thread\n");
}
return NULL;
}
DLL_EXPORT int test_start_str(const char* oldP, int id, log_message_callback_t log_callback) {
thread_data_t* data = (thread_data_t*) malloc(sizeof(thread_data_t));
if (!data) {
return -1;
}
data->oldP = oldP;
data->log_callback = log_callback;
pthread_t thread;
int result = pthread_create(&thread, NULL, thread_function, (void*) data);
if (result != 0) {
free(data);
return -1;
}
pthread_detach(thread);
return 0;
}
PHP Version
php 8.3.7
Operating System
windows10
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Piste de recherche
Commencez par reproduire l’exemple fourni de PHP FFI et C pthread avec PHP 8.3.7 sous Windows 10, en consignant l’erreur exacte du callback et le moment où elle se produit. Comparez le comportement du callback exécuté dans un thread avec celui du chemin d’appel synchrone ; le travail est terminé lorsque l’échec est reproductible et que le comportement attendu en matière de sécurité des threads ou la correction requise est clairement établi.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- c, php
- Domaine
- backend
- Type d'issue
- Bug
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Activité
- À l'abandon
- Clarté
- À clarifier
- Accessibilité débutants
- 25/100