php調用c
⑴ php如何調用函數
PHP函數調用與Java/C/C++是一樣的額,通過函數名(參數列表)就可以了,
舉個栗子:
圖中,有兩處函數調用,一開始的session_start()是調用的PHP函數,validate_user($username, $password)是用戶自定義函數,同樣的方式調用。
⑵ 關於php調用文件及參數傳遞的問題
require相當於把指定文件的代碼換到當前位置,例如
//a.php
$a=1;
$b=2;
//b.php
$c=3;
require_once('a.php');
$d=4;
在執行b.php時,相當於b.php內容如下
$c=3;//b.php中原內容
$a=1;//a.php中的內容
$b=2;//a.php中的內容
$d=4;//b.php中原內容
就是替換的關系,所以變數是通用的,不需要任何傳值,可以理解為2個文件合並到一起
建議用require_once以防止多次循環引用出錯
⑶ php怎麼調用c擴展
在PHP.INI載入編寫的擴展,然後直接當系統函數一樣使用擴展裡面的函數,調用是很簡單的。
⑷ 各位大神們,php中關於一個類中想調用多個其它類的方法,大神們有什麼辦法嗎
你為什麼不將這些類的方法歸結為一個大類呢,然後逐步細分為小類呢?
⑸ php能夠調用C或C++寫的.dll文件嗎 - PHP進階討論
可以我寫過一個調用SAP BO的COM,要調用必須先安裝好COM組件的,在注冊表查出組件名字(如果你不清楚組件名字的話)我把我寫過的函數給你看看
/**
* 載入COM組件
*/
private function createCompanyObject() {
$company = false;
try {
$company = new COM("SapBobsCom.Company");//這樣就可以獲取COM組件了
} catch(Exception $e) {
$this->errorMsg = $e->getMessage();
}
return $company;
}
⑹ php里怎麼調用外部函數啊
看樣子你是windows平台的web伺服器,關鍵是你對伺服器有多少控制力。
如果你完全可以控制伺服器,並且就是要用這種不安全的操作,那麼php配置中不要禁用exec/system/passthru 這些函數,如果不需要test.exe的返回結果,那就用exec,否則用passthrr
如果你完全可以控制伺服器,打算使用標准擴展方式,那麼應該把你的代碼做成dll,然後在php配置中載入dll。這個網上別人寫過的資料有,就是你需要php的源碼,然後自己搞定。沒辦法,開源的東西就是如此。這應該是推薦的做法。
你的描述感覺伺服器在你控制之下,否則就不可能用exe文件,只能把你的exe的功能用php實現,或者用文件之類作為媒介傳遞。
⑺ thinkphp5.0怎麼調用c
ThinkPHP函數詳解:C方法
C方法是ThinkPHP用於設置、獲取,以及保存配置參數的方法,使用頻率較高。
了解C方法需要首先了解下ThinkPHP的配置,因為C方法的所有操作都是圍繞配置相關的。
ThinkPHP的配置文件採用PHP數組格式定義。
由於採用了函數重載設計,所以用法較多,我們來一一說明下。
設置參數
C('DB_NAME','thinkphp');
表示設置DB_NAME配置參數的值為thinkphp,由於配置參數不區分大小寫,所以下面的寫法也是一樣:
C('db_name','thinkphp');
但是建議保持統一大寫的配置定義規范。
項目的所有參數在未生效之前都可以通過該方法動態改變配置,最後設置的值會覆蓋前面設置或者慣例配置裡面的定義,也可以使用參數配置方法添加新的配置。
支持二級配置參數的設置,例如:
C('USER.USER_ID',8);
配置參數不建議超過二級。
如果要設置多個參數,可以使用批量設置,例如:
$config['user_id'] = 1;
$config['user_type'] = 1;
C($config);
如果C方法的第一個參數傳入數組,就表示批量賦值,上面的賦值相當於:
C('USER_ID',1);
C('USER_TYPE',1);
獲取參數
要獲取設置的參數,可以用:
$userId = C('USER_ID');
$userType = C('USER_TYPE');
如果USER_ID參數尚未定義過,則返回NULL。
也可以支持獲取二級配置參數,例如:
$userId = C('USER.USER_ID');
如果傳入的配置參數為空,表示獲取全部的參數:
$config = C();
保存設置
3.1版本增加了一個永久保存設置參數的功能,僅針對批量賦值的情況,例如:
$config['user_id'] = 1;
$config['user_type'] = 1;
C($config,'name');
在批量設置了config參數後,會連同當前所有的配置參數保存到緩存文件(或者其他配置的緩存方式)。
保存之後,如果要取回保存的參數,可以用
$config = C('','name');
其中name就是前面保存參數時用的緩存的標識,必須一致才能正確取回保存的參數。取回的參數會和當前的配置參數合並,無需手動合並。
⑻ PHP中通過Web 執行C/C++應用程序
一、簡介
如果你對Unix/Linux有所了解的話,你應該知道他們大都自帶了C和C++的編譯器,分別是GCC和G++。Unix在程序安裝及Make等許多地方使用到了這戚圓些編譯器。利用一些控制台命令,C++和PHP, 我將向你介紹怎樣生成一個完整的C++程序例子,他可以在用PHP程序來執行,並能獲得相應的輸出結果。我將先生成C++程序代碼,並編譯它,談後討論我們將如果通過使用PHP的函數passthru來執行這個程序。從某種意義上來說,這邊文章給我們提供一種通過Web頁面來訪問一般程序的方法。
為了能更好的理解這篇文章,你應該有一台運行著apache和最新版本php的unix/Linux伺服器。同時也應該掌握C++, unix控制台命令,當然一些PHP的編程經驗也是必需的。
二、編寫一個C++程序
例如,我們可以寫一個能夠通過命令行還接收參數的C++ 簡單程序,並命名為Sampleapp.然後我們能夠按照下面的方式給他傳遞三個不同的參數 :
Sampleapp ?參高凳塌數一 ?參數二 ?參數三
這個程序的功能是能輸出傳遞給他的參數的個數和每個參數的值,然後我們可以用PHP腳本程序來執行編譯好的C++程序。
利用你習慣的文本編輯器,新建一個名為Sampleapp.cpp 的文件,再此文件中輸入如下的代碼:
#include
int main(int argc, char* argv[])
{
cout
endl
"You passed "
argc-1
" arguement"
(argc-1 == 1 ? "" : "s")
"."
endl;
cout
(argc-1 == 1 ? "This" : "These")
" arguement"
(argc-1 == 1 ? "" : "s")
" "
(argc-1 == 1 ? "is" : "are")
": "
endl
endl;
for(int i = 1; i
argc; i++)
cout
"["
i
"] "
argv[i]
endl;
return 0;
}
這個C++程序包含的程序的入口點:main(),main()函數帶了兩個參數:argc(命令行傳入參數的個數)和argv(一個包含了所傳參數實際值的字元型指針數組)。這個兩個參數能被C++編譯器自動捕獲。
cout
endl
"You passed "
argc-1
" arguement"
(argc-1 == 1 ? "" : "s")
"."
endl;;
這句話的意思是獲得從執行命令行傳入的參數的個數。Argv這個字元型指針數組是從0開始檢索的,它至少包含一個實際的值(即本程序的路徑和名稱),這個值由C++編譯器自動地附加上去。條件操作符」?」是用來判斷命粗升令行傳入地參數是否多於一個。例如,如果命令行過傳入兩個參數,我們地程序將輸出如下信息:
You passed 2 arguments.
cout
(argc-1 == 1 ? "This" : "These")
" arguement"
(argc-1 == 1 ? "" : "s")
" "
(argc-1 == 1 ? "is" : "are")
": "
endl
endl;
接下來,我們同樣用條件操作符來輸出另一句話。不過要記住,即使我們不從程序執行命令行傳入任何參數,main函數地argv[]參數也包含一個值。同樣地,如果我們從命令行傳入兩個參數給程序,程序將輸出如下地信息:
These arguments are:
for(int i = 1; i
argc; i++)
cout
"["
i
"] "
argv[i]
endl;
最後,main函數逐一的輸出命令行傳入的每個參數,它用到了一個簡單的for(;;)循環語句,這個函數能根據參數的個數將參數值一個一個的輸出。假如我們傳給程序兩個參數」first」和second」, for循環輸出的結果如下:
[1] ?first
[2] ?second
接下來,我們將編譯這個.cpp文件,如果你在Windows平台下,需要telnet到所使用的server上。在這里,我們使用大多Unix機器上都提供的G++編譯器來編譯這個源文件。不過為了確信你的機器安裝了G++,你可以輸入如下命令:which g++。如果G++已經安裝了,Unix shell將顯示出G++所在的全路徑。如果沒有安裝,它將提示你說」command couldn』t be found」. 你可以在這里下載到G++.
在源文件所在的目錄輸入如下G++命令:
g++ -c sampleapp.cpp.
通過這個命令,我們就將. cpp文件編譯成了包含機器代碼的目標文件。通過 ls ?a命令,你可以發現在本目錄下出現了一個新文件sampleapp.o,這就是.cpp源文件被編譯成機器碼的結果。不過我們最終想要的是一個可執行文件,因為我們還要輸入如下的G++命令:
g++ sampleapp.cpp ?o sampleapp
這樣我們就獲得了一個名為sampleapp的可執行文件。不過注意的是,Unix下的可執行文件跟Windows不一樣,它沒有任何後綴。
下面我們可以來檢驗一下程序執行的結果,如果如下命令:
sampleapp one -two /three
我們可以看到如下的執行結果:
You passed 3 arguments.
These arguments are:
[1] one
[2] ?two
[3] /three
現在,可執行的C++程序成生完畢,下面我們將生成一個能夠通過 web瀏覽器來訪問這個程序的PHP教本程序。
三、生成PHP腳本程序
為了能通過Internet來調用我們的C++程序,我們需要生成一個PHP腳本程序。這個PHP腳本程序將有一個Form表單,以便用戶能輸入可以傳給程序Sampleapp的參數。PHP腳本的代碼太長就不在這里全部列出了,需要的話可以通過下面的地址來下載它。(Php code)
if(@$submit)
{
}
else
{
}
#p#副標題#e#
首先,腳本程序檢查看變數$submit是否有值,這個變數$submit的值是程序後面的Form表單提交後傳遞過來的,它預設為空值。符號@的作用是當變數$submit的值不存在的時忽略相關的錯誤信息。
由於變數$submit預設為空,所以一開始執行else{}中的代碼,它在瀏覽器上簡單的顯示一個Form表單。Form的action屬性設為變數 $PHP_SELF,即表單提交後返回本頁。同時Form表單包含了一個文本輸入條,這是用來讓用戶輸入要傳遞給C++程序的命令行參數。Form如下圖所示:
一旦我們輸入執行命令並提交表單,變數$submit(即按鈕Go的名字)就獲得一個值,這樣PHP教本將執行if{}之間的代碼。
if($args == "")
echo " You didn't enter any arguments.";
else
{
echo " SampleApp Result";
$command = "/htdocs/sampleapp " . escapeshellcmd($args);
passthru($command);
}
變數$args是自動產生的,它的值是Form表單中文本輸入條傳過來的值。如果沒有輸入任何信息,程序將簡單的告訴用戶沒有輸入任何值。
如果用戶輸入任何非空的信息,程序將把text域的值,即變數$args傳給C++程序。下面這段代碼就是執行C++的程序的執行命令:
$command = "/htdocs/sampleapp " . escapeshellcmd($args);
函數eacapeshellcmd是用來當做安全檢查工具,以過濾調一些如」,」,」」和」」等的特殊字元。這可以防止一些用戶企圖輸入某些字元來調用系統內部命令。
例如,如果你在Form表單的text域中輸入」1 ?two /three」,那麼變數$command的值就為: /htdocs/sampleapp 1 ?two /three
你能發現我們定義了程序sampleapp的全路徑,在這個例子中,程序文件位於/htdocs目錄下。你可以根據的自己程序所在的目錄做相應的修改。
passthru($command);
最後,我們使用PHP的函數passthru來執行變數$command所包含的命令並且將原始的執行結果輸出到瀏覽器上。在我的伺服器上,返回結果的HTML頁面如下:
w在本文即將結束之前,幾個可能碰到的問題我想說一下。首先,當你執行sampleapp.php教本程序的時候,如果你沒有看到程序的任何輸出信息,或許是開了安全模式。如果這樣,系統將不會允許PHP腳本來執行系統內部程序。其次,在一些Unix系統上,PHP函數passthru不能將內部程序的輸出傳遞給瀏覽頁面,如果發生這種情況,可以用system函數來代替passthru函數。
四、結論
從本的例子可以看出,Unix操作系統非常強大,並且PHP允許開發者通過腳本以獨立的線程來執行系統內部程序。本文的所給的例子非常的簡單,但是只要再多花一點功夫,你可以寫一個能更新Mysql資料庫的c++程序,運行其他系統命令的程序或者是操作系統文件/目錄結構的程序。但是,不管怎樣,你都應該確保你的系統安全,絕對不能讓任何其他的腳本程序隨意訪問系統內部程序。
#p#副標題#e#
⑼ PHP怎麼調用gcc對.c文件進行編譯
簡單點說:
1、新建.c文件(如A.c)
2、在當前目錄下打開此渣終端
3、孝扒伏輸入指令:巧攜gcc -c 文件名.c
gcc 文件名.o -o 文件名
./文件名
⑽ C++的標准動態庫為什麼不能被PHP調用
php調用C/C++動態鏈接庫
一、簡介
一般而言,php速度已經比較快,但是,對於一些較高級開發者而言,如果想要追求更快的速度,那毫無疑問可以通過自己寫c代碼,並編譯為動態鏈接庫(常為.so文件),然後php通過創建一個新的擴展(extension),並在擴展里調用該.so文件,同時對外暴露出php函數介面。
在實際使用中,只要調用該函數介面,即可使用底層更快速的c函數服務。
二、起因
之所以本人要研究這么個問題,主要是近來項目中需要調用一個自己開發的圖像處理的動態鏈接庫,希望伺服器能夠對客戶端提供該圖像處理服務。而我們伺服器開發語言選擇了php,所以著手此問題。
三、實現方法
廢話不多說,為了實現php調用c庫,我在網上搜了個遍也沒找到幾篇好文章,只有兩篇還不錯的,分享在本文最末,有興趣的讀者可以去閱讀。
下面,本文的開發環境背景是CentOS release 6.5 。為了能夠調用c庫,我們的php 5.6.9,apache 2.4均是下載源碼並編譯的,不可直接通過yum安裝!請注意。至於php和apache的源碼編譯本文不提,只要注意在configure打開合適開關即可。
具體步驟如下:
將共享庫.so添加入系統配置中(假設共享庫名為 'libhello.so')
cp libhello.so /usr/local/lib
echo /usr/local/lib > /etc/ld.so.conf.d/local.conf
/sbin/ldconfig
在php/ext目錄下創建擴展頭文件,取名為myfunctions.def
在該文件里填寫c函數聲明即可。每個函數一行。
string hello(int a)
int hello_add(int a, int b)
使用ext_skel搭建擴展骨架
./ext_skel --extname=myfunctions --proto=myfunctions.def
打開config.m4 中的enable開關
PHP_ARG_ENABLE(myfunctions, whether to enable myfunctions support,
[ --enable-myfunctions Include myfunctions support])
上面把擴展骨架建立好了,下面重新配置php (下面是我個人配置文件,讀者需要結合自己情況修改)
./buildconf --force //生成新配置腳本
'./configure' '--prefix=/usr/local/php' '--with-libdir=lib64' '--enable-fpm' '--with-fpm-user=php-fpm' '--with-fpm-group=www--enable-mysqlnd' '--with-mysql=mysqlnd' '--with-mysqli=mysqlnd' '--with-pdo-mysql=mysqlnd' '--enable-opcache' '--enable-pcntl' '--enable-mbstring' '--enable-soap' '--enable-zip' '--enable-calendar' '--enable-bcmath' '--enable-exif' '--enable-ftp' '--enable-intl' '--with-openssl' '--with-zlib' '--with-curl' '--with-gd' '--with-zlib-dir=/usr/lib' '--with-png-dir=/usr/lib' '--with-jpeg-dir=/usr/lib' '--with-gettext' '--with-mhash' '--with-ldap' '--disable-fileinfo' '--with-config-file-path=/usr/local/php/etc' '--with-apxs2=/usr/local/httpd/bin/apxs' '--enable-myfunctions' // 配置
記住!一定在末尾加上 —enable-myfunctions 。這樣子才會被編譯進php中。
當擴展編譯進去了之後,就可以開始修改擴展里的myfunctions.c文件,在裡面可以添加php->c的轉接函數,在轉接函數里可以調用.so內的函數。
比如要添加一個hello_add的php函數,裡面可以調用c函數add(int a, int b)
a. 添加函數聲明
PHP_FE(hello_add, NULL)
b. 添加php函數
PHP_FUNCTION(hello_add){ ... }
注意,在該函數里,如果調用了.so文件里的介面函數,那麼待會在make的時候,要指定所使用的.so共享庫,該共享庫必須完成第1步中添加到系統配置的操作。
如果調用了.so文件,那麼要在php/Makefile中添加
Extra_LDFLAG = -lhello //對應前面的libhello.so
Extra_libs = -lhello
(make clean)
每次修改完上面的c文件,都要重新make
make
make install
重啟apache伺服器
httpd -k restart
在phpinfo里可以看到新擴展,可以直接在php調用新擴展內的函數。