我正在使用 iron.io 及其工作线程任务作为后台进程。我的代码相当简单,就像:
<?php
require 'vendor/autoload.php';
$uri = "my_connection_string";
$client = new MongoClient($uri);
:
:
composer.json就像:
{
"require": {
"iron-io/iron_worker": "2.0.4",
"wp-cli/php-cli-tools": "~0.10.3"
}
}
然后我首先安装所有依赖项,
docker run --rm -it -v "$PWD":/worker -w /worker iron/php:dev composer install
压缩我的代码,
zip -r worker.zip .
上传它,
iron --env dev worker upload --name task-name -zip ./worker.zip iron/php:dev php ./worker.php
然后输出此错误。
PHP Fatal error: Class 'MongoClient' not found in /mnt/task/worker.php on line xxx
我也尝试了MongoDBDriverManager
,MongoDBDriverClient
,同样的错误发生了。当我尝试运行php -m
时,它显示:
[PHP Modules]
Core
curl
date
ereg
fileinfo
filter
hash
json
libxml
mbstring
mysqlnd
pcre
readline
Reflection
session
SimpleXML
SPL
standard
tokenizer
xmlwriter
[Zend Modules]
看起来甚至MongoDB扩展都没有安装,而他们说它已安装。http://dev.iron.io/worker/languages/php/
我错过了什么吗?如何在 PHP 中使用 MongoDB 驱动程序与 iron worker 一起使用?
对于那些可能和我处于相同情况的人来说,发生这种情况是因为 Iron.io 现在集成了Docker,我们必须指定运行代码时使用的映像,但是iron/php映像不包括它们曾经支持的任何其他中间件。
因此,我们必须编写自己的DockerFile来安装MongoDB或MySQL或我们需要的任何必要的中间件和软件。
至于MongoDB,这是一个Dockerfile的例子。
iron/php:5.6.14
RUN apk update
RUN apk upgrade
RUN apk add alpine-sdk
RUN apk add zlib-dev
RUN apk add curl
RUN apk add bash
RUN apk add perl
RUN apk add re2c
RUN apk add pcre-dev
RUN apk add openssl-dev
RUN apk add php-dev autoconf
RUN git clone https://github.com/mongodb/mongo-php-driver.git
WORKDIR ./mongo-php-driver
RUN which php
RUN git submodule sync && git submodule update --init
RUN phpize
RUN ./configure
RUN make all -j 5
RUN make install
RUN echo 'extension=mongo.so' >> /etc/php.ini
请注意,这根本没有在图像大小方面进行优化。
我认为如果Iron.io提供这样的图像会很有帮助。