Запустите отдельный процесс в фоновом режиме, чтобы отправить запрос. Даже если вы используете асинхронный http-запрос (независимо от того, какой язык вы используете), вы все равно должны дождаться завершения запроса, прежде чем выйти из своего скрипта/программы.
PHP - это не Java, каждый раз, когда PHP-скрипт завершается, все ресурсы будут уничтожены, если асинхронный http-запрос не завершен, он будет отменен.
Вы можете вызвать «nohup /path/your_script» для выполнения некоторых фоновых задач.
Подсказка: открытые файлы PHP не помечаются как FD_CLOEXEC, поэтому, если у вас есть длительная фоновая задача, вы должны сначала закрыть унаследованные файловые дескрипторы, иначе произойдет утечка ресурсов.
Вот несколько кодов C, которые я использовал для запуска фоновых задач в PHP: он сначала закрывает все унаследованные файловые дескрипторы, перенаправляет stdout/stderr в /dev/null, затем переходит в фоновый режим (например, nohup)
/*
gcc -m32 bgexec.c -o bgexec
*/
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
void close_fds()
{
char buf[256];
struct dirent *dp;
snprintf(buf, 255, "/proc/%i/fd/", getpid());
DIR *dir = opendir(buf);
while ((dp = readdir(dir)) != NULL) {
if(dp->d_name[0] && dp->d_name[0] != '.') {
//printf("fd: %s\n", dp->d_name);
close(atoi(dp->d_name));
}
}
closedir(dir);
}
int main(int argc, char *argv[])
{
int pid;
signal(SIGCLD, SIG_IGN); // no defunct when no wait();
if (argc < 2)
return fprintf(stderr, "No arguments given\n"), 1;
/* Fork it */
pid = fork();
if(pid < 0)
return fprintf(stderr, "Couldn't fork\n"), 127;
if (pid == 0) {
/* Child */
setsid();
umask ( 0 ); /* clear file mode creation mask */
close_fds();
int fd = open("/dev/null", O_RDWR);
dup2(0, 1);
dup2(0, 2);
signal(SIGHUP, SIG_IGN); // no hup
signal(SIGCLD, SIG_DFL); // keep away from 'exec' returns ECHILD
/* Execute it */
execv(argv[1], &argv[1]);
exit(127);
}
return 0;
}
person
shawn
schedule
10.01.2019