27 9月 2007

[PHP] Linux底下 透過php呼叫外部程式執行開檔 發生錯誤

我撰寫了一個php的網頁
透過exec呼叫一個外部程式a.out
a.out裡頭執行了open file的動作
不管是用fopen() 還是ifstream.open()
原本不存在這個檔案 還是原本存在這個檔案
最後的結果都是open file fail!

讓我覺得很奇怪
明明直接由console執行這個a.out的程式
一切正常....open file success!!!


但是一透過php去執行它,開檔就會失敗....不知為何...

以下為php的code..
<?php
echo exec("/home/falldog/a.out");
?>

a.out的source code

#include <iostream>
int main(int argc, char** argv){
FILE * file = fopen("/home/falldog/aaa.txt","w");
if( file==NULL )
printf("open file error!!!n");
else
printf("open file success!!!n");
return 0;
}


試了很多次
最後才發現只要將路徑改為/tmp/就ok了
原來…透過php去呼叫a.out
可能牽涉到檔案目錄權限問題...因為/home/falldog/底下不為php網頁的權限目錄
因此,開檔時,會有錯誤發生
所以只要將這個暫存檔開啟在/tmp/就不會發生這樣的問題了

2 則留言:

張家榮 提到...

大大 能在詳細敘述 一下您的檔案過程

因為我看了還是 試不出來

Falldog 提到...

要注意,在Linux底下,假設是透過Apache執行PHP的話,Apache應該會有個user id/name,可能叫WWW還是什麼的吧。

要確認這個WWW的user id有沒有權限讀取你指定的目錄,因為PHP的執行就是透過這個WWW的user。

所以才說/tmp才能被執行,因為/tmp的權限比較寬鬆