将长 运行 PHP-脚本的状态传达给其他 PHP-SSE 脚本的最佳方式

Best way to communicate the status of long running PHP-script to other PHP-Script for SSE

我有一个很长的 运行 PHP-脚本,它处理一个大的 XML-文件。

  1. 用户 XML 上传到 upload.php
  2. upload.php运行几分钟
  3. 浏览器创建新的 EventSource("status.php") 来询问当前状态

那么让 status.php 知道 upload.php 在做什么的最佳实践方法是什么?

计划是在 upload.php 中写一个日志文件,让 status.php 查看日志文件中是否有新内容。

但是可以肯定的是,还有其他方法可以让 upload.php 和 status.php 一起通信,或者不?

我通常做的是创建一个数据库 table 来保存代表文件上传的记录,以及 return 对这些记录的引用(我喜欢使用 GUID 令牌,而不仅仅是自动 -递增 ID)在初始文件上传请求时发送给客户端。然后客户端轮询接受标识符作为参数的服务,验证记录属于用户,然后 returns 详细信息。处理文件导入的进程根据需要更新记录。一旦记录指示完成或失败,客户端可以在导入完成或失败后重定向到他们应该去的地方。在失败时使用诊断详细信息、异常等更新“注释”字段。

CREATE TABLE `file_imports` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
    `user_id` int(11) unsigned NOT NULL,
    `file_name` varchar(128) NOT NULL,
    `status` enum('Pending','Processing','Success','Failed') NOT NULL DEFAULT 'Pending',
    `notes` longtext,
    `create_date` datetime NOT NULL,
    `complete_date` datetime DEFAULT NULL,
    `token` varchar(80) NOT NULL,
    PRIMARY KEY (`id`),
    UNIQUE KEY (`token`),
    KEY `file_imports_user_fk` (`user_id`),
    CONSTRAINT `file_imports_user_fk` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE
);