诉求:在仓库列表显示的页面上,添加一个更新的按钮,实现仓库更新
分析:仓库生成或者更新的列表的命令是
全量生成或者更新: php bin/satis build satis.json public/ 指定生成或者更新 php bin/satis build satis.json public/ test/test1 test/test2
可以通过php的shell_exec函数实现此功能
主要代码如下:
全量生成或者更新:
<?php $output = shell_exec('php /data/wwwroot/satis/bin/satis build /data/wwwroot/satis/satis.json /data/wwwroot/satis/public/'); echo "<pre><p style='backgroud-color:#ccc;'>$output</p></pre>";
exit();
指定生成或者更新
<?php //获取包名,注意此处的安全性处理,我这里就略过了 if (! empty($_REQUEST)) { $packName = $_REQUEST['packName']; //指定包生成或者更新 $output = shell_exec('php /data/wwwroot/satis/bin/satis build /data/wwwroot/satis/satis.json /data/wwwroot/satis/public/ ' . $packName); echo "<pre><p style='backgroud-color:#ccc;'>$output</p></pre>"; exit(); }
注意几点问题
1.权限问题
因为网页版更新,是通过nginx+php-fpm来处理,所以注意php-fpm服务的启动用户,我的是www用户
a.首先确保你有www用户,没有的话需要提前创建www用户,这里就不赘述了;
b.其次要确保www用户有php的可执行权限,可以通过shell_exec('php -i');测试是否有可执行权限
c.是否有目录的可执行权限,涉及到的目录有
/data/wwwroot/satis/bin/satis /data/wwwroot/satis/satis.json /data/wwwroot/satis/public/
2.用户密码问题
首次执行之前,需要在服务器上通过php的cli模式手动触发一次,这个主要目的就是存储账号和密码,因为命令在执行时候会拉取代码,这个时候会提示输入gitlab的账号和密码,记得选择yes就行了,账号或者密码一般会存储在用户的家目录下.composer目录里面
这样在网页点击更新按钮的时候就可以正常更新了。
如果过程中遇到问题,主要可能是shell_exec,执行报错,可以通过输出错误结果进行排查
<?php
//命令行后面跟上2>&1,中间有空格,就可以输出整个命令执行的结果
$output = shell_exec('php /data/satis/composer/bin/satis build /data/wwwroot/satis/satis.json /data/wwwroot/satis/public/ 2>&1');
print_r($output);