php调用matlab环境的可执行文件在网页显示结果(失败---成功)

此时此刻的心情是无比的舒畅啊!!!niangdi搞了一天能试的法子都试了,没有用,现在记录一下,试错过程,以后有水平够了继续来,如果有大佬知道解决方法跪求评论区解决方法!!!

在发完这篇博客大概一个小时后,我搞出来了。发现我的直觉是对的,就是因为权限的问题

我实验的第一种方式是对的,只是没有操作好!!!

问题

用C++调用自己编写的matlab函数(这一块前几篇《Ubuntu 相关》的博客已经说明),在服务器端可以正常运行,但是在网页端出现了Could not initialize libpredictresultInitialize!的问题。

之前在ubuntu上也出现过,但是配置好环境变量就好了。

当时也不知道什么原因,也没有找到相关的资料,最主要的是没有错误信息,这就很难受,不知道哪里有错啊!!!

结果现在再次出现这种问题就没有对应的解决方案了!!!

实验平台

阿里云服务器安装centos 8.0系统

安装MCR Install环境版本为v 9.1

cmake 编译器为3.13.2

php版本为php7.3.24

Apache版本为Apache/2.4.37 (centos)

php代码

  1 <?php
  2 
  3 $Train_date = "/var/www/html/predictresults/xunlianjitezheng.mat";
  4 $Test_date = "/var/www/html/predictresults/ceshijitezheng.mat";
  5 echo "I get the date!\r\n";
  6 
  7 $command = "./usePredictresult 2>&1 ".$Train_date." ".$Test_date.";exit;";
  8 echo "I get the command!\r\n";
  9 
 10 $result = exec($command, $output, $rs);
 11 //$result = system($command, $var);
 12 echo "I get the result!\r\n";
 13 
 14 echo $result;
 15 echo "\r\n";
 16 
 17 //var_dump(end($output));
 18 
 19 //echo count($output);
 20 //echo "\r\n";
 21 
 22 //echo $output;
 23 //echo "\r\n";
 24 
 25 print_r($output);
 26 
 27 ?>

尝试的解决方案(失败)

用户权限的问题

查阅php.ini配置文档

以下内容参考博客《ubuntu下php调用执行shell脚本

php --ini

在这里插入图片描述
这里为啥是php73呢,因为我后面把尝试过把php74改成php73!!!

vim /etc/opt/remi/php73/php.ini

关闭安全模式 safe_mode=Off

通过vim查找命令:

/safe_mod          //自上往下查找
?safe_mode          //自下往上查找

并没有找到这个设置选项,索性自己加上:
在这里插入图片描述
顺便改了一下内存限制(忘记从哪篇博客上看的了,没有笔记!!!):
在这里插入图片描述

给予php运行的用户和本机用户权限

以下参考博客《通过sudo解决php执行linux脚本的权限问题
查看php运行的用户可以通过下面这个php网页获取。

<?php 
    echo shell_exec("id -a");
?>

在这里插入图片描述
在这里插入图片描述
sudo 命令,为非根用户授予根用户的权限

配置文件是/etc/sudoers,此文件有权限限制,而且有格式要求,万一改错会比较麻烦。使用visudo可以容易配置。

在这里插入图片描述
root下面两行是我输入的,我最先输入的是apache,关闭文件后再次打开,就变成上面图片的内容了,咱也不知道为啥,反正改了也没啥用。

第一种尝试,死亡!!!
在这里插入图片描述

补充:sudo介绍

sudo允许root分配给普通用户一些不具备的权利,让普通用户也可以具有root用户的相关权限(比如说sudo可以分配给某一用户某些特定的命令执行权限)。

其中sudo一个重要的文件就是/etc/sudoers,哪些用户具有什么样的命令可以执行都是靠这个文件的,主要只有里面分配了的用户才能使用sudo。

sudo -l //列出该用户能执行的命令
sudo -u //user 以指定用户来执行命令
sudo -k //清楚入场券上的时间,下次使用sudo还要输入密码
sudo -b //在后台执行命令

到这里突然想到一个问题,可以不可把运行matlab函数写到shell文件里,然后php网页端调用shell文件。写完再试试!!!

更改php版本

为啥要更改版本呢,因为师哥用的版本跟我用的版本不一样,他成功了,我却失败了,那是版本不匹配的问题?试试呗!!!

卸载所有php7.4:

yum remove php74-php*

启用 PHP 7.3 的 Remi 模块并进行安装

dnf -y install dnf-utils
yum search php73*
yum install php73-php 
php73 -v

在这里插入图片描述
然后终端运行没毛病,网页端死了!!!

在这里插入图片描述
在这里插入图片描述

添加ctf文件

为啥要添加呢,参考博客《C++中调用matlab的dll文件(解决初始化失败的问题)》,这是在window系统上的解决方案,只能死马当活马医了!!!

matlab的app工具没法生成ctf文件,所以使用mcc生成相应文件,具体过程请参考我的博客《Ubuntu下用c++调用自己编写的matlab函数》。

在本地生成之后,上传到云端,终端运行没毛病,网页上还是不行。

在这里插入图片描述
在这里插入图片描述
现在我要去尝试shell的方案了!!!

尝试的解决方案(成功)

好吧我承认我尝试了shell的方式,虽然有点蠢,但并不是没有用,我验证了权限是否设置好了!!!

以下内容参考dalao博客《php利用root权限执行shell脚本(二)》。

我做的跟之前唯一一点不一样的地方就是sudoers这个文件做了微小改动!!!
改动之前:
在这里插入图片描述
改动之后:
在这里插入图片描述

看图中每行都有三个ALL,第一个ALL代表网络中的主机,第二个括号里面的ALL代表目标用户,表示以谁的身份去执行命令,最后一个ALL代表的是可执行的命令名(可以指定你想要该用户能够执行的命令)。

其中NOPASSWD表示不用输入密码。(为了方便嘛,不然我通过浏览器访问难道程序里面多了道填写密码,还要等反馈,真是麻烦,这样就省事多了)

只是改动了php端的用户名,我不知道为啥之前改不了!!!

改动之后的运行结果:(喜大普奔啊!!!)
在这里插入图片描述

说一下过程

查看一下你的Apache的执行用户:

lsof -i:80 

在这里插入图片描述
发现就是apache,这跟网页显示的一样:(我之前一直感觉网页现实的不靠谱!!)
在这里插入图片描述

查看Apache的配置文件

查看apache的安装位置:

rpm -ql httpd

在这里插入图片描述
查看文件:

cd /etc/httpd/conf
ls
vim httpd.conf

在这里插入图片描述
发现用户名还是apache,这就更加确定了,我之前的文件改动有错,然后一改,结果就成了!!!

舒服了!!!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值