導航:首頁 > 編程語言 > phphook鉤子

phphook鉤子

發布時間:2022-08-11 14:22:00

A. 插件鉤子如何自定義,要些什麼特別設置嗎

OneThink以其便捷的建站、豐富的擴展、靈活的二次開發,以及雲服務的支持,為廣大個人和企業建站帶來新的契機和機遇,即將成為互聯網新的弄潮兒。 OneThink特性介紹: 1. 基於Thinkphp最新版本Thinkphp3.2。 2. 模塊化:全新的架構和模塊化的開發機制,便於靈活擴展和二次開發。 3. 文檔模型/分類體系:通過和文檔模型綁定,以及不同的文檔類型,不同分類可以實現差異化的功能,輕松實現諸如資訊、下載、討論和圖片等功能。 4. 開源免費:OneThink遵循Apache2開源協議,免費提供使用。 5. 用戶行為:支持自定義用戶行為,可以對單個用戶或者群體用戶的行為進行記錄及分享,為您的運營決策提供有效參考數據。 6. 雲端部署:通過驅動的方式可以輕松支持平台的部署,讓您的網站無縫遷移,內置已經支持SAE。 7. 雲服務支持:即將啟動支持雲存儲、雲安全、雲過濾和雲統計等服務,更多貼心的服務讓您的網站更安心。 8. 安全穩健:提供穩健的安全策略,包括備份恢復、容錯、防止惡意攻擊登錄,網頁防篡改等多項安全管理功能,保證系統安全,可靠、穩定的運行。 9. 應用倉庫:官方應用倉庫擁有大量來自第三方插件和應用模塊、模板主題,有眾多來自開源社區的貢獻,讓您的網站「One」美無缺。 oneThink後台添加插件步驟: 版本:V1.1.141212 (註:v1.1也有很多版本,一不小心就下到V1.1.140202 去了,還有其他版本,建議去代碼託管平台下載最新版本) 我也不偷懶,把每一步步驟都記錄下來。 一、進入後台,創建插件 這里的鉤子我新建了一個indexFooter,因為我只需在前台首頁底部顯示友情鏈接即可。我們把上面所有要勾的地方都勾上,至於有什麼區別,大家可以自己建幾個例子區分一下,生成的文件是否一樣。OK!到這里 我們的友情鏈接插件就創建好了!點擊「確定」。(這里的自定義模板什麼的,通通不填,我會在下篇文章演示添加自定義模板的效果) 二、點擊「安裝」 即可,找到我們剛安裝好的Links插件,點擊「設置」,你會看到它有個默認的「是否開啟隨機」的選項,這里我們不管它,因為我們用不上,等下要刪掉的。安裝後,我們可以在左側導航「已安裝插件後台」看到我們新建的「友情鏈接」 三、當我們點擊左側導航的「友情鏈接」,你會發現報錯,大概就是說的某個表不存在。是的,我們剛才只是建了插件,如果涉及到數據存儲到資料庫, 還需要建表。這里不直接去資料庫里建,因為這樣做,是很不人性化的。那我們就找到安裝插件的函數,在安裝插件的時候建立資料庫,這樣就好了。首先系統的插件全部存放在 根目錄/Addons/ 文件夾下面,打開此文件夾,我們看到有個Links文件夾,這就是我們剛創建的插件,一個插件對應一個文件夾。打開Links文件夾,裡面有2個文件和2個文件夾。 四、其實現在oneThink做的越來越簡潔了,不懂PHP的人照樣創建插件,之後你就會發現。當然,如果你有自己的想法,不想局限於官方的限制,那還是要把php學好的。 五、打開插件入口文件:LinksAddon.class.php 裡面有個類LinksAddon,先來分析一下這個文件吧 我這里把$admin_list 數組的model 值改成links了,為了與插件對應。接下來我們在install方法里添加新建資料庫的語句,這樣我們在安裝插件的時候,就會新建資料庫了,我的代碼如下: public function install(){//安裝插件的方法 //1、添加數據表 $model = D(); $db_prefix = C('DB_PREFIX'); $table_name = "{$db_prefix}links"; $sql=<<<SQL CREATE TABLE IF NOT EXISTS `$table_name` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵', `title` varchar(80) NOT NULL DEFAULT '' COMMENT '站點名稱', `link` varchar(140) NOT NULL DEFAULT '' COMMENT '鏈接地址', `summary` varchar(255) NOT NULL DEFAULT '' COMMENT '站點描述', `mailto` varchar(100) NOT NULL DEFAULT '' COMMENT '站長聯系方式', `sort` int(3) unsigned NOT NULL DEFAULT 0 COMMENT '優先順序', `nofollow` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '是否追蹤', `type` tinyint(3) unsigned NOT NULL DEFAULT 1 COMMENT '類型分組', `cover_id` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '封面圖片', `status` tinyint(2) NOT NULL DEFAULT 1 COMMENT '狀態(0:禁用,1:正常)', `create_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '添加時間', PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='友情連接表'; SQL; $model -> execute($sql);//執行sql語句 //2、返回true,表示插件安裝成功 return true; } 我這里省略了很多細節判斷,大家自己完善。 六、既然在安裝插件的時候,新建了表,我們在卸載的插件的時候就要把表給刪除,不然下次安裝該插件的時候就會出問題。所以我們uninstall 方法代碼如下: public function uninstall(){ //卸載插件的方法 $model = D(); $db_prefix = C('DB_PREFIX'); $table_name = "{$db_prefix}links"; $sql="DROP TABLE IF EXISTS `".$table_name."`;"; $model -> execute($sql);//執行sql語句 return true; } 好了,到這里就差不多了,保存一下LinksAddon.class.php 文件,應該可以正常顯示了,我們來看看。進入插件列表,先把Links插件卸載,然後重新安裝。點擊左側菜單「友情鏈接」,可以看到 之所以能正常顯示這個列表,是因為系統有默認的模板,在\Application\Admin\View\Addons 文件夾里,有興趣的同學可以研究一下這幾個模板文件,其中這個列表的模板就是adminlist.html,那麼我們要把封面、書名、描述等等這些字眼改掉,要去模板里改嗎?細心的同學估計注意到了,在LinksAddon.class.php 文件 的$admin_list 數組里配置的,其他的看後面的注釋就明白,這里詳細說一下list_grid 關聯的數組。我們剛才新建的links數據表有id、title、link等欄位,你想在這個列表顯示什麼欄位,都可以添加。我這里代碼如下: 'list_grid'=>array( //這里定義的是除了id序號外的表格里欄位顯示的表頭名和模型一樣支持函數和鏈接 'title:網站名稱', 'link:鏈接', 'summary:描述', 'create_timetime_format:添加時間', //time_format 是一個函數,把時間格式化,其他地方想使用什麼函數也可以按照這種格式書寫 'id:操作:[EDIT]編輯,[DELETE]刪除' ), 保存,刷新後台友情鏈接列表 我們點擊「新增」 來增加一個友情鏈接吧,你會發現,只有一個書名欄位。我們打開Model/LinksModel.class.php 文件,我這里分別解釋一下這兩個自帶的數組,具體看下面代碼里的注釋 class LinksModel extends Model{ public $model = array( 'title'=>'',//新增[title]、編輯[title]、刪除[title]的提示 'template_add'=>'',//自定義新增模板自定義html edit.html 會讀取插件根目錄的模板 'template_edit'=>'',//自定義編輯模板html 'search_key'=>'',// 搜索的欄位名,默認是title 'extend'=>1, //在後台列表是否顯示 「增加」、「刪除」 按鈕,0-不顯示 1-顯示 ); public $_fields = array( 'id'=>array( 'name'=>'id',//欄位名,與資料庫的欄位對應 'title'=>'ID',//顯示標題 'type'=>'num',//欄位類型:num、string、textarea、datetime、bool、select、radio、checkbox、editor、picture(封面)、file(附件)、 'remark'=>'',// 備注,相當於配置里的tip 'is_show'=>3,// 1-始終顯示 2-新增顯示 3-編輯顯示 0-不顯示 'value'=>0,//默認值 ), //下面演示一下 select欄位怎麼顯示 radio、checkbox同理 'type'=>array( 'name'=>'type', 'title'=>'類型', 'type'=>'select', 'remark'=>'請選擇所屬類型', 'is_show'=>1, 'extra'=>'0:友情鏈接,1:合作站點', 'value'=>0, 'is_must'=>1, ), ); } ok,我最後的效果是這樣的: 添加一條數據看看吧: 這里要顯示具體類型、顯示圖片等,需要自定義adminlist.html模板了。關於自定義模板,我們下一篇文章再說。關於鉤子,其實就是寫一個函數從資料庫讀取數據,然後在前台需要的地方調用鉤子就行。如果需要模板,則在鉤子函數里解析模板。鉤子調用格式一般: {:hook("鉤子名稱"),"[參數]"} 沒參數就不寫。直接寫成這樣{:hook("鉤子名稱")} 到此為止就是用系統默認的模板,一步一步的建立自己的插件,是不是很簡單,就像填空題一樣,只要按照它的規則填空,就ok了。 以上就是本文的全部內容,希望對大家學習PHP程序設計有所幫助。

B. 如何在AKCMS中HOOK(鉤子)執行自己的代碼求解

本功能為二次開發者設計,站長看不懂不影響正常使用,繞行即可。
不需要修改AKCMS的代碼即可實現這樣的功能,不修改AKCMS代碼的好處是保持以後升級的時候不需要把修改過的文件,修改過的代碼merge到新的版本中,始終保持獨立。
AKCMS 2.7以上版本在動態執行時會檢查(/plugins/runtime/)中是否有_before.php結尾的文件,如果有就在頁面打開之前執行他們。頁面打開完畢後檢查(/plugins/runtime/)中是否有_after.php結尾的文件,如果有就執行他們。
例如這個需求:把所有動態執行的每一次訪問的訪問地址都記下日誌以便分析。
拷貝以下代碼:<?php
error_log($_SERVER['REQUEST_URI'].\n, 3, AK_ROOT.'./logs/log.txt');?保存為/plugins/runtime/log_after.php即可。
注意:生成靜態頁之後,直接就是HTML文件的顯示,當然不能執行任何代碼,所以本文所說的功能都是針對AKCMS動態執行時而言。
3.8新增功能:採集功能的hook
hook程序的以函數的形式統一寫在configs/hook.php中,函數命名規則:
1 採集列表頁的hook,命名為hook_spidelist_123(123代表採集規則ID,下同)
2 採集內容頁的hook,命名為hook_spiderurl_123
以數組的形式向hook函數傳入已經採集到的全部數據。舉一個例子:要把採集內容頁(假設內容頁採集規則的ID是1)採集到的title中的字母全部大寫就在/configs/hook.php中增加這樣一個函數:
function hook_spiderurl_1($value) {
$value['title'] = strtoupper($value['title']);
return $value;}保存後就立即生效了,下次採集完ID1的採集規則後,會自動調用這個函數,實現你想要的功能。
3.8.4新增功能:保存內容的hook
hook程序的以函數的形式統一寫在configs/hook.php中,函數命名規則:
1 修改內容正文的hook,命名為hook_saveitemdata_123(123代表所屬模塊ID,下同)
函數會傳入兩個參數,第一個是正文內容,第二個是除正文外其他欄位的一個數組。返回值是處理後的正文內容。
2 修改內容其他欄位的hook,命名為hook_saveitem_123
函數會傳入兩個參數,第一個是除正文外其他欄位的一個數組,第二個是正文內容。返回值是處理後的數組。

C. thinkphp hook 怎麼寫

ThinkPHP3.2 擴展--鉤子,HOOK
之前寫到TP3.1的行為擴展是tag();在TP3.2中引入了另一種說法—:鉤子。

我們來看一下TP3.2中的鉤子這個東西:

一:文件流程:

1:/index.php ->require './ThinkPHP/ThinkPHP.php';

2:/ThinkPHP/ThinkPHP.php—->require CORE_PATH.'Think'.EXT; Think\Think::start();

3:/ThinkPHP/Library/Think/Think.class.php—–>App::run();

4:/ThinkPHP/Library/Think/App.class.php 。到這里基本流程就走完了,(這里不說細節);

二:代碼:

1:看一下 App::run()方法:

// 應用初始化標簽
Hook::listen('app_init');
App::init();
// 應用開始標簽
Hook::listen('app_begin');
// Session初始化
if(!IS_CLI){
session(C('SESSION_OPTIONS'));
}
// 記錄應用初始化時間
G('initTime');
App::exec();
// 應用結束標簽
Hook::listen('app_end');
return ;

其中的Hook::listen(」)就是用來執行鉤子的,我們可以在app_init這個安插的位置用來獲取應用中安裝的插件。

看一下Hook::listen();

/**
* 監聽標簽的插件
* @param string $tag 標簽名稱
* @param mixed $params 傳入參數
* @return void
*/
static public function listen($tag, &$params=NULL) {
if(isset(self::$tags[$tag])) {
if(APP_DEBUG) {
G($tag.'Start');
trace('[ '.$tag.' ] --START--','','INFO');
}
foreach (self::$tags[$tag] as $name) {
APP_DEBUG && G($name.'_start');
$result = self::exec($name, $tag,$params);
if(APP_DEBUG){
G($name.'_end');
trace('Run '.$name.' [ RunTime:'.G($name.'_start',$name.'_end',6).'s ]','','INFO');
}
if(false === $result) {
// 如果返回false 則中斷插件執行
return ;
}
}
if(APP_DEBUG) { // 記錄行為的執行日誌
trace('[ '.$tag.' ] --END-- [ RunTime:'.G($tag.'Start',$tag.'End',6).'s ]','','INFO');
}
}
return;
}

其中關鍵是:self::exec($name, $tag,$params); 看一下exec的代碼:

/**
* 執行某個插件
* @param string $name 插件名稱
* @param string $tag 方法名(標簽名)
* @param Mixed $params 傳入的參數
* @return void
*/
static public function exec($name, $tag,&$params=NULL) {
if(false === strpos($name,'\\')) {
// 插件(多個入口)
$class = "Addons\\{$name}\\{$name}Addon";
}else{
// 行為擴展(只有一個run入口方法)
$class = $name.'Behavior';
$tag = 'run';
}
$addon = new $class();
return $addon->$tag($params);
}

最後還不是 new $class();進而return $addon->$tag($params); 又轉到了具體鉤子的代碼方法。其實就是我們原本的調用class的方法,只不過經過別人的高度封裝了。

三:那麼問題來了,這個鉤子有什麼用呢? 怎麼用?

這里以OneThink 的{:hook('AdminIndex')}為例,看一些別人是怎麼用的。

在系統初始化到 Hook::listen('app_init'); 時,

把app_init的標簽位擴展了,在tags.php的配置文件中有這么個東西:用於初始化插件(或者說是獲取系統中安裝的插件)

<?php
return array(
'app_init'=>array('Common\Behavior\InitHook')
);

一看就明白,無非就是讀取持久化的信息,放到緩存或是其他的方式

// 行為擴展的執行入口必須是run
public function run(&$content){
if(isset($_GET['m']) && $_GET['m'] === 'Install') return;

$data = S('hooks');
if(!$data){
$hooks = M('Hooks')->getField('name,addons');
foreach ($hooks as $key => $value) {
if($value){
$map['status'] = 1;
$names = explode(',',$value);
$map['name'] = array('IN',$names);
$data = M('Addons')->where($map)->getField('id,name');
if($data){
$addons = array_intersect($names, $data);
Hook::add($key,$addons);
}
}
}
S('hooks',Hook::get());
}else{
Hook::import($data,false);
}
}

當在程序執行到{:hook(『AdminIndex』)}時—>調用的是Hook::listen(『AdminIndex』);

AdminIndex這個掛載點包含了三個插件:分別是:SiteStat, SystemInfo,DevTeam。

用一個循環來分別按順序執行.

總結:鉤子其實就是起到一個掛載點的作用,這個鉤子掛在哪裡,就可以在哪裡執行,內容或功能就是掛載插件或類庫的具體實現。這樣實現的代碼就有很大的靈活性,掛載點不變,掛的東西變數,功能也就相應的變化,是不是很靈活強大呀。

D. PHP中如何實現Hook機制

給你推薦2個方法

  1. 類的__call 和__callstatic 。 這2個魔術方法是當調用類的內部方法不存在時執行。__call是實例化類之後調用方法不存在。__callstatic 是調用靜態方法不存在,它裡面的參數包含了方法名和傳遞的參數。這樣就可以利用這2個方法去實現hook機制。根據方法名和參數去找指定位置的文件和方法執行。use_call_func和use_call_func_array 具體看文檔

  2. 是反射機制。php已經很早就有反射機制了。利用類的反射機制。去實現hook。其實原理和1方法差不多。但是實現的方法比較高級而已。

E. PHP程序,如何監控內存情況

看到有人寫透視寶做php監控的原理圖,跟你分享下。我估計大家做的方式都是差不多。

PHP運行支撐的ZendEngine早在設計過程中已經預留了豐富的Hook,可以有效干涉處理過程中的幾個關鍵步驟。利用了以下幾個Hook,就能方便的獲取數據:

1. zend_compile_file & zend_compile_string

載入分析文件或字元串,本身就會造成非常大的IO,如果過多地執行載入,無疑會造成內存和CPU的消耗.通過這兩個hook,可以取得文件名、執行行數、使用內存和CPU佔用時間。

2.zend_execute & zend_execute_internal

通過這兩個hook的使用,我們可以准確地分析得出一個PHP應用中的類調用、方法調用、方法參數、內存佔用和CPU佔用,加以分析,便可以准確得出應用系統運行過程中的方法運行棧,API調用地址,SQL語句,CacheKey以及Cache命中等關鍵信息。

3.zend_throw_exception_hook

利用異常鉤子,可以准確地得到應用系統運行過程中出現的異常信息,當然包括異常發生的類方法位置,參數,異常code和異常message。

4.zend_error_cb

錯誤鉤子則更加直接,可以准確得到系統運行過程中出現的任何一個warning,代碼錯誤或語法錯誤。

F. php中關於hook用途的問題

PHP 寫插件 其中的HOOK 只是別人想的一個詞語,術語而已
並無實際意義
在WINDOWS編程中 HOOK==鉤子
是一種消息機制的一種
意思就是:蚊子叮了你一口,你的大腦神經接收到了,於是指揮肢體,去趕走還是拍死這個蚊子
這個大腦神經就是HOOK,系統接收用戶操作,而HOOK則監視某一滿足條件
用戶輸入A
,系統接收到A,而HOOK定義接收B,那麼輸入A,則不做操作
當輸入B了,則激活HOOK,進行執行制定代碼
PHP的插件HOOK,比如你添加一個插件,把這個插件信息提前告訴HOOK,然後HOOK去監視用戶
當用戶調用這個插件,HOOK就感知到了
於是就把插件功能實現出來

G. 誰能給個tp3.2.2 hook類的使用方法,我是要做動態插件

方法定義在function.PHP中
/**
* 處理插件鉤子
* @param string $hook 鉤子名稱
* @param mixed $params 傳入參數
* @return void
*/
function hook($hook,$params=array()){
\Think\Hook::listen($hook,$params);
}

H. 關於HOOK,如何通過鉤子截獲指定窗口的所有消息

這個參數應該是你調用SetWindowsHookEx的DLL的模塊實例句柄,它可以經由DllMain入口的第一個參數得到。 HHOOK SetWindowsHookEx( int idHook, HOOKPROC lpfn, HINSTANCE hMod, DWORD dwThreadId);至於SetWindowsHookEx的第四個參數dwThreadId,才是你需要藉由窗口句柄得到的窗口線程ID,你可以通過下面的代碼獲得: DWORD dwThreadID = GetWindowThreadProcessId(hwnd, NULL);選擇相應的消息鉤子,比如WH_CALLWNDPROC(用來監視窗口過程)、WH_GETMESSAGE(用來監視消息隊列的消息)、WH_KEYBOARD(鍵盤消息)、WH_MOUSE(滑鼠消息)等等。

閱讀全文

與phphook鉤子相關的資料

熱點內容
如何把掃描文件做成pdf格式 瀏覽:624
php個性qq源碼 瀏覽:821
初學c語言顯示源未編譯 瀏覽:245
資產概況源碼 瀏覽:472
dos命令建文件夾命令 瀏覽:379
解壓的密碼htm被屏蔽 瀏覽:502
冬天太冷冰箱壓縮機不啟動怎麼辦 瀏覽:83
手機打開vcf需要什麼編譯器 瀏覽:910
加密磁碟後開機很慢 瀏覽:271
長沙智能雲控系統源碼 瀏覽:258
阿里雲伺服器如何設置操作系統 瀏覽:1000
超級命令的英文 瀏覽:784
做賬為什麼要用加密狗 瀏覽:586
考研群體怎麼解壓 瀏覽:159
linux修改命令提示符 瀏覽:226
圓圈裡面k圖標是什麼app 瀏覽:63
pdf加空白頁 瀏覽:948
linux伺服器如何看網卡狀態 瀏覽:318
解壓新奇特視頻 瀏覽:707
圖書信息管理系統java 瀏覽:554