此时此刻的心情是无比的舒畅啊!!!niangdi搞了一天能试的法子都试了,没有用,现在记录一下,试错过程,以后有水平够了继续来,如果有大佬知道解决方法跪求评论区解决方法!!!
在发完这篇博客大概一个小时后,我搞出来了。发现我的直觉是对的,就是因为权限的问题
。
我实验的第一种方式是对的,只是没有操作好!!!
php调用matlab环境的可执行文件在网页显示结果(失败)
问题
用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
,这就更加确定了,我之前的文件改动有错,然后一改,结果就成了!!!
舒服了!!!