文章目錄

前面说了为了能够方便的通过网页对博客进行修改,我想用php搭个平台,实现对博客的修改发布等等。
我的博客有个独立的用户hexo,博客的所有文件都在这个用户下,hexo的环境也在这个用户下,所以基本上就是对hexo这个用户文件的操作。php默认只能对其本目录文件进行操作,即/var/www/html/目录,对其他目录没有访问权限,所以要想操作hexo用户的文件,必须就行权限设置。
文件操作之权限设置

php之所以不能操作hexo用户下的文件,是因为httpd是通过用户Apache来运行的,Apache并没有权限去访问用户hexo的文件。
简单起见我直接把httpd改成以hexo用户权限来运行就好了,这样httpd即php就有了hexo用户的所有权限,即:
vim /etc/httpd/conf/httpd.conf 修改User Group选项

1
2
3
4
5
6
#  don't use Group #-1 on these systems!
#
User hexo
Group work

### Section 2: 'Main' server configuration

我的php文件也都是在hexo用户下编写的,然后复制到/var/www/html/目录下,为了方便操作直接把/var/www/html/目录设置成hexo用户的,即
chown -R hexo: /var/www/html/
而且注意php session存放的目录也要改成hexo用户权限,即
chown -R hexo: /var/lib/php/session

文件操作之目录遍历

1
2
3
4
5
6
7
8
<?php 
$path="/home/hexo/blog/source/_posts/";
$files=scandir($path);
function dirfilt($file){
return !is_dir($file);
}
$files=array_filter($files,"dirfilt");
echo count($files); ?>

文件操作之读文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
$path="/home/hexo/blog/source/_posts/";
$p=strpos($_SERVER['REQUEST_URI'], 'filename=');
$fileName = substr($_SERVER['REQUEST_URI'],$p+9);
if(!file_exists($path.$fileName)){
$cmd="cd /home/hexo/blog && hexo new ".$fileName;
exec($cmd);
$fileName=$fileName.".md";
}
$handle = fopen($path.$fileName, "r");
while (!feof($handle)){
$text = fgets($handle);
echo $text;
}
fclose($handle);
?>

文件操作之写文件

1
2
3
4
5
6
7
8
9
10
<?php
$path="/home/hexo/blog/source/_posts/";
$handle=fopen($path.$_POST['file_name'], "w");
$text=$_POST['file_contents'];
fwrite($handle,$text);
fclose($handle);
echo "end write......<br/>\n";
header("refresh:3;url=file.php");
print('处理完成,请稍等...<br>3秒后自动跳转。');
?>

文件操作之执行脚本

1
2
3
4
5
6
7
8
9
10
11
<?php
$cmd="cd /home/hexo/blog && /home/hexo/blog/hexo.py b";
$handle = popen($cmd, 'r');
while(!feof($handle)) {
$buffer = fgets($handle);
echo "$buffer<br/>\n";
ob_flush();
flush();
}
pclose($handle);
?>

这里需要注意,php的执行环境与用户直接登录的环境是不同的,用户登录是有shell打开的,php运行环境似乎没有;
在我调用第三方程序或脚本的时候/usr/local/bin目录下的程序必须用绝对路径调用,相对路径找不到程序,这是因为\$path里并没有包含路径/usr/local/bin,所以找不到命令,但用户直接登录时\$path包含了该路径,可以直接运行;
alias命令好像也没法执行,好比ll命令要换成ls -l命令才可以正确执行。

文章目錄