如何在PHP的Amp\parallelMap中使用全局常量?
如何在PHP的Amp\parallelMap中使用全局常量?
这个问题其实是因为Amp的parallelMap依赖的工作进程(或线程)和主进程是完全隔离的——主进程里定义的全局常量、类甚至全局变量,都不会自动同步到工作进程的环境里,所以你在闭包里访问MAX_DATA才会报未定义的错误。
你现在的方法虽然能解决问题,但有点冗余,这里有两个更优雅的方案:
方案一:在Worker初始化时加载Bootstrap文件
Amp的DefaultPool支持传入一个初始化回调,这个回调会在每个工作进程启动时执行一次。你可以在这里加载你的bootstrap文件,这样所有工作进程都会自动定义好MAX_DATA等常量,不用在每个闭包里重复操作:
// 创建Worker工厂(可选,默认会用DefaultWorkerFactory) $workerFactory = new DefaultWorkerFactory(); // 初始化Pool时指定回调,每个worker启动时加载bootstrap $pool = new DefaultPool(self::THREAD_COUNT, $workerFactory, function () { // 这里填你的bootstrap文件路径,确保worker进程能访问到 require_once __DIR__ . '/path/to/your/bootstrap.php'; }); // 之后正常使用parallelMap即可,闭包里直接访问常量 $results = wait(parallelMap($data, function ($point) { return $this->reCalc($point); }, $pool));
这种方式的好处是全局统一初始化,所有工作进程的环境和主进程保持一致,不管你调用多少次parallelMap,都不用再处理常量的问题。
方案二:在初始化回调中直接定义常量
如果你不想加载整个bootstrap文件,也可以在回调里只定义需要的常量:
$pool = new DefaultPool(self::THREAD_COUNT, null, function () { // 直接在这里定义常量,值和主进程保持一致 define('MAX_DATA', MAX_DATA); });
不过这种方式适合常量很少的场景,如果有多个全局配置,还是加载bootstrap更省心。
为什么你的原有方案不太理想?
你原来的方法是在每个闭包执行时检查并定义常量,虽然能运行,但每次处理一个$point都会执行一次defined检查,有点浪费资源。而且如果后续有其他闭包或者多次调用parallelMap,还要重复写这段代码,维护起来麻烦。
而初始化回调只会在每个工作进程启动时执行一次,效率更高,代码也更干净。
备注:内容来源于stack exchange,提问作者user2531657
相关产品推荐
相关产品推荐

