Laradock生态下, 如何使用PHP函数exec()或shell_exec()执行某些系统命令?
诉求
由于项目需要调用一个java编写的算法接口, 所以就在workspace
中安装了java8环境并将此算法代码通过javac
成功编译后实测在命令行中可以直接运行java main
得到结果. 这样在项目业务中就可以直接使用诸如:exec('java main', $res)
来获取调用java算法的结果. 可实际情况却并不顺利, 问题在下面描述.
环境信息如下:
Component | Version |
---|---|
PHP | 7.3.15 |
Swoole | 4.5.2 |
LaravelS | 3.7.8 |
Laravel Framework | 5.8.31 |
Java jdk | 1.8.0_212 |
在环境的基础上新增了java8环境
/laradock/workspace/Dockerfile
新增如下:
.
.
.
###########################################################################
# Java8 jdk-8u212
###########################################################################
USER laradock
# 解压jdk8包至指定目录
ADD ./jdk8/jdk-8u212-linux-x64.tar.gz /home/laradock/.java
# 添加算法所需jar包
COPY ./jdk8/jars/fastjson-1.2.70.jar /home/laradock/.java/jdk1.8.0_212/lib
# 设置laradock用户的环境变量
RUN echo "" >> ~/.bashrc && \
echo 'export JAVA_HOME="$HOME/.java/jdk1.8.0_212"' >> ~/.bashrc && \
echo 'export PATH="$JAVA_HOME/bin:$PATH"' >> ~/.bashrc && \
echo 'export CLASSPATH="$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/fastjson-1.2.70.jar"' >> ~/.bashrc
# ENV JAVA_HOME $JAVA_HOME
# ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/fastjson-1.2.70.jar
# Add JAVA binaries to root's .bashrc
USER root
# 将.java所有权更改为laradock(注意此时的用户是root)并添加root用户的环境变量
RUN chown -R laradock:laradock /home/laradock/.java && \
echo "" >> ~/.bashrc && \
echo 'export JAVA_HOME="/home/laradock/.java/jdk1.8.0_212"' >> ~/.bashrc && \
echo 'export PATH="$JAVA_HOME/bin:$PATH"' >> ~/.bashrc && \
echo 'export CLASSPATH="$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/fastjson-1.2.70.jar"' >> ~/.bashrc
# Add PATH For Java
ENV PATH $PATH:/home/laradock/.java/jdk1.8.0_212/bin
修改Dockerfile后重新构建容器workspace(docker-compose up -d --build --force-recreate workspace
)
下图为命令行执行php脚本打印的结果:
困惑
而在实际项目运行时得到的结果却是:
为了方便描述问题, 这里采用了在浏览器控制台直接打印出结果
我们再对比下命令行的环境变量 $PATH
:
以及php
的路径:
从上图中可以看出, 命令行下的用户是laradock
, 和控制台打印的用户是同一个, 然而php
命令的路径却不一样? 环境变量也完全不一样, 这是为何….? 这个问题困扰了我很久, 也google了很多资料, 还是不知道如何解决…
推荐文章: