㈠ 怎樣在php的Laravel框架中完成任務調度
<p>那個函數。最後return 一個返回值 .所以結果就把操作的運算符給列印出來了。沒有把結果給到的結果return 出去。自然輸出不 了</p><p>可以在最後一行的時候,把$sum的值和$oper一起return 出來
return $sum.$oper;
你可以去後盾人平台看看,裡面的東西不錯
㈡ PHP的路由是什麼 還有什麼通俗的說法嗎
你所說的路由其實和路由器是一個道理, 通過一個入口接受請求, 然後通過(URL)匹配規則將請求分發到不同的地方。具體到一些主流框架上面,Router模塊會配合Http模塊分析請求, 並且按照一定規則解析去匹配路由,然後使用調度模塊使邏輯調到某塊代碼(通常是控制器),最後返回響應(Response)。
所以說你就把這種路由當做家裡用來上網的路由器, 道理是一樣的。
㈢ TP框架的業務邏輯誰能給我說說
你是要系統流程吧?
這個手冊裡面有的。我給你粘貼一份吧
用戶URL請求
調用應用入口文件(通常是網站的index.php)
載入框架入口文件(ThinkPHP.php)
記錄初始運行時間和內存開銷
系統常量判斷及定義
載入框架引導類(ThinkThink)並執行Think::start方法進行應用初始化
設置錯誤處理機制和自動載入機制
調用ThinkStorage類進行存儲初始化(由STORAGE_TYPE常量定義存儲類型)
部署模式下如果存在應用編譯緩存文件則直接載入(直接跳轉到步驟22)
讀取應用模式(由APP_MODE常量定義)的定義文件(以下以普通模式為例說明)
載入當前應用模式定義的核心文件(普通模式是ThinkPHP/Mode/common.php)
載入慣例配置文件(普通模式是ThinkPHP/Conf/convention.php)
載入應用配置文件(普通模式是Application/Common/Conf/config.php)
載入系統別名定義
判斷並讀取應用別名定義文件(普通模式是Application/Common/Conf/alias.php)
載入系統行為定義
判斷並讀取應用行為定義文件(普通模式是Application/Common/Conf/tags.php)
載入框架底層語言包(普通模式是ThinkPHP/Lang/zh-cn.php)
如果是部署模式則生成應用編譯緩存文件
載入調試模式系統配置文件(ThinkPHP/Conf/debug.php)
判斷並讀取應用的調試配置文件(默認是Application/Common/Conf/debug.php)
判斷應用狀態並讀取狀態配置文件(如果APP_STATUS常量定義不為空的話)
檢測應用目錄結構並自動生成(如果CHECK_APP_DIR配置開啟並且RUNTIME_PATH目錄不存在的情況下)
調用ThinkApp類的run方法啟動應用
應用初始化(app_init)標簽位偵聽並執行綁定行為
判斷並載入動態配置和函數文件
調用ThinkDispatcher::dispatch方法進行URL請求調度
自動識別兼容URL模式和命令行模式下面的$_SERVER['PATH_INFO']參數
檢測域名部署以及完成模塊和控制器的綁定操作(APP_SUB_DOMAIN_DEPLOY參數開啟)
分析URL地址中的PATH_INFO信息
獲取請求的模塊信息
檢測模塊是否存在和允許訪問
判斷並載入模塊配置文件、別名定義、行為定義及函數文件
判斷並載入模塊的動態配置和函數文件
模塊的URL模式判斷
模塊的路由檢測(URL_ROUTER_ON開啟)
PATH_INFO處理(path_info)標簽位偵聽並執行綁定行為
URL後綴檢測(URL_DENY_SUFFIX以及URL_HTML_SUFFIX處理)
獲取當前控制器和操作,以及URL其他參數
URL請求調度完成(url_dispatch)標簽位偵聽並執行綁定行為
應用開始(app_begin)標簽位偵聽並執行綁定行為
調用SESSION_OPTIONS配置參數進行Session初始化(如果不是命令行模式)
根據請求執行控制器方法
如果控制器不存在則檢測空控制器是否存在
控制器開始(action_begin)標簽位偵聽並執行綁定行為
默認調用系統的ReadHtmlCache行為讀取靜態緩存(HTML_CACHE_ON參數開啟)
判斷並調用控制器的_initialize初始化方法
判斷操作方法是否存在,如果不存在則檢測是否定義空操作方法
判斷前置操作方法是否定義,有的話執行
Action參數綁定檢測,自動匹配操作方法的參數
如果有模版渲染(調用控制器display方法)
視圖開始(view_begin)標簽位偵聽並執行綁定行為
調用ThinkView的fetch方法解析並獲取模版內容
自動識別當前主題以及定位模版文件
視圖解析(view_parse)標簽位偵聽並執行綁定行為
默認調用內置ParseTemplate行為解析模版(普通模式下面)
模版引擎解析模版內容後生成模版緩存
模版過濾替換(template_filter)標簽位偵聽並執行綁定行為
默認調用系統的ContentReplace行為進行模版替換
輸出內容過濾(view_filter)標簽位偵聽並執行綁定行為
默認調用系統的WriteHtmlCache行為寫入靜態緩存(HTML_CACHE_ON參數開啟)
調用ThinkView類的render方法輸出渲染內容
視圖結束(view_end)標簽位偵聽並執行綁定行為
判斷後置操作方法是否定義,有的話執行
控制器結束(action_end)標簽位偵聽並執行綁定行為
應用結束(app_end)標簽位偵聽並執行綁定行為
執行系統的ShowPageTrace行為(SHOW_PAGE_TRACE參數開啟並且不是AJAX請求)
日誌信息存儲寫入
㈣ java有什麼常用開源的框架
java常用開源框架如下:
1.Spring Framework 【Java開源JEE框架】
Spring是一個解決了許多在J2EE開發中常見的問題的強大框架。 Spring提供了管理業務對象的一致方法並且鼓勵了注入對介面編程而不是對類編程的良好習慣。Spring的架構基礎是基於使用JavaBean屬性的Inversion of Control容器。然而,這僅僅是完整圖景中的一部分:Spring在使用IoC容器作為構建完關注所有架構層的完整解決方案方面是獨一無二的。
2.WebWork 【Java開源Web開發框架】
WebWork是由OpenSymphony組織開發的,致力於組件化和代碼重用的拉出式MVC模式J2EE Web框架。
3.Struts 【Java開源Web開發框架】
Struts是一個基於Sun J2EE平台的MVC框架,主要是採用Servlet和JSP技術來實現的。由於Struts能充分滿足應用開發的需求,簡單易用,敏捷迅速,在過去的一年中頗受關注。Struts把Servlet、JSP、自定義標簽和信息資源(message resources)整合到一個統一的框架中
4.Hibernate 【Java開源持久層框架】
Hibernate是一個開放源代碼的對象關系映射框架,它對JDBC進行了非常輕量級的對象封裝,使得Java程序員可以隨心所欲的使用對象編程思維來操縱資料庫。 Hibernate可以應用在任何使用JDBC的場合
5.Quartz 【Java開源調度框架】
Quartz是OpenSymphony開源組織在Job scheling領域又一個開源項目,它可以與J2EE與J2SE應用程序相結合也可以單獨使用。Quartz可以用來創建簡單或為運行十個,百個,甚至是好幾萬個Jobs這樣復雜的日程序表。
6.Velocity 【Java開源模板引擎】
Velocity是一個基於java的模板引擎(template engine)。它允許任何人僅僅簡單的使用模板語言(template language)來引用由java代碼定義的對象。 當Velocity應用於web開發時,界面設計人員可以和java程序開發人員同步開發一個遵循MVC架構的web站點,也就是說,頁面設計人員可以只關注頁面的顯示效果,而由java程序開發人員關注業務邏輯編碼。Velocity將java代碼從web頁面中分離出來,這樣為web站點的長期維護提供了便利,同時也為我們在JSP和PHP之外又提供了一種可選的方案。
7.IBATIS 【Java開源持久層框架】
使用ibatis 提供的ORM機制,對業務邏輯實現人員而言,面對的是純粹的Java對象, 這一層與通過Hibernate 實現ORM 而言基本一致,而對於具體的數據操作,Hibernate 會自動生成SQL 語句,而ibatis 則要求開發者編寫具體的SQL 語句。相對Hibernate等 「全自動」ORM機制而言,ibatis 以SQL開發的工作量和資料庫移植性上的讓步,為系統 設計提供了更大的自由空間。作為「全自動」ORM 實現的一種有益補充,ibatis 的出現顯 得別具意義。
㈤ php面試題 memcache和redis的區別
Redis與Memcached的區別傳統MySQL+ Memcached架構遇到的問題實際MySQL是適合進行海量數據存儲的,通過Memcached將熱點數據載入到cache,加速訪問,很多公司都曾經使用過這樣的架構,但隨著業務數據量的不斷增加,和訪問量的持續增長,我們遇到了很多問題:1.MySQL需要不斷進行拆庫拆表,Memcached也需不斷跟著擴容,擴容和維護工作占據大量開發時間。2.Memcached與MySQL資料庫數據一致性問題。3.Memcached數據命中率低或down機,大量訪問直接穿透到DB,MySQL無法支撐。4.跨機房cache同步問題。眾多NoSQL百花齊放,如何選擇最近幾年,業界不斷涌現出很多各種各樣的NoSQL產品,那麼如何才能正確地使用好這些產品,最大化地發揮其長處,是我們需要深入研究和思考的問題,實際歸根結底最重要的是了解這些產品的定位,並且了解到每款產品的tradeoffs,在實際應用中做到揚長避短,總體上這些NoSQL主要用於解決以下幾種問題1.少量數據存儲,高速讀寫訪問。此類產品通過數據全部in-momery 的方式來保證高速訪問,同時提供數據落地的功能,實際這正是Redis最主要的適用場景。2.海量數據存儲,分布式系統支持,數據一致性保證,方便的集群節點添加/刪除。3.這方面最具代表性的是dynamo和bigtable 2篇論文所闡述的思路。前者是一個完全無中心的設計,節點之間通過gossip方式傳遞集群信息,數據保證最終一致性,後者是一個中心化的方案設計,通過類似一個分布式鎖服務來保證強一致性,數據寫入先寫內存和redo log,然後定期compat歸並到磁碟上,將隨機寫優化為順序寫,提高寫入性能。4.Schema free,auto-sharding等。比如目前常見的一些文檔資料庫都是支持schema-free的,直接存儲json格式數據,並且支持auto-sharding等功能,比如mongodb。面對這些不同類型的NoSQL產品,我們需要根據我們的業務場景選擇最合適的產品。Redis適用場景,如何正確的使用前面已經分析過,Redis最適合所有數據in-momory的場景,雖然Redis也提供持久化功能,但實際更多的是一個disk-backed的功能,跟傳統意義上的持久化有比較大的差別,那麼可能大家就會有疑問,似乎Redis更像一個加強版的Memcached,那麼何時使用Memcached,何時使用Redis呢?如果簡單地比較Redis與Memcached的區別,大多數都會得到以下觀點:1 Redis不僅僅支持簡單的k/v類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。2 Redis支持數據的備份,即master-slave模式的數據備份。3 Redis支持數據的持久化,可以將內存中的數據保持在磁碟中,重啟的時候可以再次載入進行使用。拋開這些,可以深入到Redis內部構造去觀察更加本質的區別,理解Redis的設計。在Redis中,並不是所有的數據都一直存儲在內存中的。這是和Memcached相比一個最大的區別。Redis只會緩存所有的 key的信息,如果Redis發現內存的使用量超過了某一個閥值,將觸發swap的操作,Redis根據「swappability = age*log(size_in_memory)」計 算出哪些key對應的value需要swap到磁碟。然後再將這些key對應的value持久化到磁碟中,同時在內存中清除。這種特性使得Redis可以 保持超過其機器本身內存大小的數據。當然,機器本身的內存必須要能夠保持所有的key,畢竟這些數據是不會進行swap操作的。同時由於Redis將內存 中的數據swap到磁碟中的時候,提供服務的主線程和進行swap操作的子線程會共享這部分內存,所以如果更新需要swap的數據,Redis將阻塞這個 操作,直到子線程完成swap操作後才可以進行修改。使用Redis特有內存模型前後的情況對比:VM off: 300k keys, 4096 bytes values: 1.3G usedVM on: 300k keys, 4096 bytes values: 73M usedVM off: 1 million keys, 256 bytes values: 430.12M usedVM on: 1 million keys, 256 bytes values: 160.09M usedVM on: 1 million keys, values as large as you want, still: 160.09M used當 從Redis中讀取數據的時候,如果讀取的key對應的value不在內存中,那麼Redis就需要從swap文件中載入相應數據,然後再返回給請求方。 這里就存在一個I/O線程池的問題。在默認的情況下,Redis會出現阻塞,即完成所有的swap文件載入後才會相應。這種策略在客戶端的數量較小,進行 批量操作的時候比較合適。但是如果將Redis應用在一個大型的網站應用程序中,這顯然是無法滿足大並發的情況的。所以Redis運行我們設置I/O線程 池的大小,對需要從swap文件中載入相應數據的讀取請求進行並發操作,減少阻塞的時間。如果希望在海量數據的環境中使用好Redis,我相信理解Redis的內存設計和阻塞的情況是不可缺少的。補充的知識點:memcached和redis的比較1 網路IO模型Memcached是多線程,非阻塞IO復用的網路模型,分為監聽主線程和worker子線程,監聽線程監聽網路連接,接受請求後,將連接描述字pipe 傳遞給worker線程,進行讀寫IO, 網路層使用libevent封裝的事件庫,多線程模型可以發揮多核作用,但是引入了cache coherency和鎖的問題,比如,Memcached最常用的stats 命令,實際Memcached所有操作都要對這個全局變數加鎖,進行計數等工作,帶來了性能損耗。(Memcached網路IO模型)Redis使用單線程的IO復用模型,自己封裝了一個簡單的AeEvent事件處理框架,主要實現了epoll、kqueue和select,對於單純只有IO操作來說,單線程可以將速度優勢發揮到最大,但是Redis也提供了一些簡單的計算功能,比如排序、聚合等,對於這些操作,單線程模型實際會嚴重影響整體吞吐量,CPU計算過程中,整個IO調度都是被阻塞住的。2.內存管理方面Memcached使用預分配的內存池的方式,使用slab和大小不同的chunk來管理內存,Item根據大小選擇合適的chunk存儲,內存池的方式可以省去申請/釋放內存的開銷,並且能減小內存碎片產生,但這種方式也會帶來一定程度上的空間浪費,並且在內存仍然有很大空間時,新的數據也可能會被剔除,原因可以參考Timyang的文章:/memcached/)。Memcached的客戶端軟體實現非常多,包括C/C++, PHP, Java, Python, Ruby, Perl, Erlang, Lua等。當前Memcached使用廣泛,除了LiveJournal以外還有Wikipedia、Flickr、Twitter、Youtube和WordPress等。在Window系統下,Memcached的安裝非常方便,只需從以上給出的地址下載可執行軟體然後運行memcached.exe –d install即可完成安裝。在linux等系統下,我們首先需要安裝libevent,然後從獲取源碼,make && make install即可。默認情況下,Memcached的伺服器啟動程序會安裝到/usr/local/bin目錄下。在啟動Memcached時,我們可以為其配置不同的啟動參數。1.1 Memcache配置Memcached伺服器在啟動時需要對關鍵的參數進行配置,下面我們就看一看Memcached在啟動時需要設定哪些關鍵參數以及這些參數的作用。1)-p Memcached的TCP監聽埠,預設配置為11211;2)-U Memcached的UDP監聽埠,預設配置為11211,為0時表示關閉UDP監聽;3)-s Memcached監聽的UNIX套接字路徑;4)-a 訪問UNIX套接字的八進制掩碼,預設配置為0700;5)-l 監聽的伺服器IP地址,默認為所有網卡;6)-d 為Memcached伺服器啟動守護進程;7)-r 最大core文件大小;8)-u 運行Memcached的用戶,如果當前為root的話需要使用此參數指定用戶;9)-m 分配給Memcached使用的內存數量,單位是MB;10)-M 指示Memcached在內存用光的時候返回錯誤而不是使用LRU演算法移除數據記錄;11)-c 最大並發連數,預設配置為1024;12)-v –vv –vvv 設定伺服器端列印的消息的詳細程度,其中-v僅列印錯誤和警告信息,-vv在-v的基礎上還會列印客戶端的命令和相應,-vvv在-vv的基礎上還會列印內存狀態轉換信息;13)-f 用於設置chunk大小的遞增因子;14)-n 最小的chunk大小,預設配置為48個位元組;15)-t Memcached伺服器使用的線程數,預設配置為4個;16)-L 嘗試使用大內存頁;17)-R 每個事件的最大請求數,預設配置為20個;18)-C 禁用CAS,CAS模式會帶來8個位元組的冗餘;2. Redis簡介Redis是一個開源的key-value存儲系統。與Memcached類似,Redis將大部分數據存儲在內存中,支持的數據類型包括:字元串、哈希表、鏈表、集合、有序集合以及基於這些數據類型的相關操作。Redis使用C語言開發,在大多數像Linux、BSD和Solaris等POSIX系統上無需任何外部依賴就可以使用。Redis支持的客戶端語言也非常豐富,常用的計算機語言如C、C#、C++、Object-C、PHP、Python、Java、Perl、Lua、Erlang等均有可用的客戶端來訪問Redis伺服器。當前Redis的應用已經非常廣泛,國內像新浪、淘寶,國外像Flickr、Github等均在使用Redis的緩存服務。Redis的安裝非常方便,只需從bin目錄下。在啟動Redis伺服器時,我們需要為其指定一個配置文件,預設情況下配置文件在Redis的源碼目錄下,文件名為redis.conf。php面試題 memcache和redis的區別
㈥ php swoole 只能運行在php-cli 環境嗎
一直想寫點Swoole的東西,畢竟它重新定義了php,卻一直不知道怎麼下手寫Swoole涉及的知識點非常多,互為表裡,每次想寫都發現根本理不出一個頭緒Swoole是一個php的擴展,它的核心目的就是解決php在實現server服務中可能遇到的一系列問題,這些問題用源生的php往往並不能很高效(執行效率)的解決,一般也不會使用php來解決,所以會有說swolle重新定義的php的說法。
其實swoole也提供了一個框架,swoole framework是基於swoole extension設計的一個框架,要用好這個框架,還是要先了解swoole extension。
擴展的英文名稱是Extension,php擴展是用C語言作為開發語言,基於Zend引擎提供的API,編譯成的一個動態庫。
如果曾經做過類似動態庫調用開發的童鞋可能會更好理解一些,例如Android中的NDK開發在php的配置文件中配置好extension的屬性後,就可以引用這個動態庫了。
也就是說,swoole本身是用C語言編寫的,它可以讓php獲得一些額外的function。
然後是運行方式,swoole的許多功能都只能運行在cli模式下,而cli模式往往是很多剛接觸swoole的phper遇到的第一個問題。
有時候其實只是需要轉變一下思路
我們現在整理一下最常見的php代碼執行方式:
安裝apache、php
配置apache對那個目錄進行php解析
用瀏覽器訪問那個目錄的php文件
更多的細節這里就不提了,畢竟我相信每個phper對這個都是很熟悉的。
但這里就開始出現了第一個問題,我們知道,php是一個腳本語言,腳本語言的核心特點在於不用編譯,隨時執行,而執行腳本的工具就是解析器,而php的解析器就是zend引擎。
嚴格來說,zend並不是唯一的選擇,不過,zend是最官方的。另外,Zend Studio和Zend Engine不是同一個東西,本文中的Zend全部指Zend Engine。
換個角度講,只要有解析器,寫好的php腳本就是可以執行的,而zend引擎與apache之間並沒有絕對的關系實際上,apahce是調用了zend對php腳本進行執行,然後將執行結果輸出給了瀏覽器所以所謂cli模式(CommandLine,命令行模式),其實就是在命令行下直接調用zend引擎對php腳本進行解析並執行,並獲得程序輸出結果的php腳本執行方式。
其實php也可以作為shell腳本來使用哦,就像bash shell一樣既然問題講清楚了,在一個系統中具體怎麼操作呢?
本文以CentOS 7.5作為系統環境,swoole是針對linux系統開發的,windows下並不適用。學習swoole的一個前題是懂得基本的linux系統使用。
當安裝好php的時候,找到php的安裝目錄,如果是默認安裝的話,可以試試whereis命令# 某種簡單的方法
whereis php
> /usr/local/bin/php;
locate whereis find這些命令都可以試試,目的是找到php然後我們來寫一個最經典的php腳本:
<?php
//vi hello_cli.php
echo 'Hello PHP Cli';
編寫純php腳本時,php標簽不要封口
然後我們在shell里執行它:
/usr/local/bin/php hello_cli.php
> Hello PHP Cli
這段代碼中的第一個php,是一個可執行文件,它接受一個php腳本文件作為輸入參數,並解析執行這個php腳本文件(通過zend)。
沒有錯,第一個cli模式下的php程序就被你執行成功了!
默認情況下,php都會被安裝在了$PATH的目錄下,那就可以直接省略路徑前綴了,下文中調用php的時候,全都省略了路徑前綴。
因為swoole是pecl的項目,所以使用pecl安裝是最簡單的方法,強烈推薦第一次接觸的童鞋先使用pecl安裝,在熟悉了swoole之後,再考慮使用編譯安裝的方式以獲取更多進階功能。
pecl這個工具基本都會被安裝在與php相同的目錄下(往往也都是$PATH目錄)pecl install swoole
執行以下命令查看是否安裝成功:
php -m | grep swoole
> swoole
如果正確的輸出了swoole,那麼恭喜你,這次安裝很成功另一個常見的比較麻煩的問題是,有些童鞋的電腦里安裝了多個php,而安裝的時候沒有正確的安裝到預期的php的擴展目錄中,就會導致無法正常工作,解決方案就是弄清楚各個php安裝目錄及配置關系,選擇正確的目錄進行安裝。
其實本文還沒正式開始介紹swoole,都是在學習swoole之前的准備工作,swoole的上手門檻比一般的php應用要高的多,如果沒有網路開發和操作系統方面的一些知識,學習它並不是一件容易的事情,學習曲線很陡峭。
這句話我在群里說了無數次
很多新手會詬病swoole的手冊寫的太模糊,其實是前置知識不足,而手冊也給出了需要的前置知識列表,以下引用至官網的手冊-學習swoole需要哪些知識?
多進程/多線程
了解Linux操作系統進程和線程的概念
了解Linux進程/線程切換調度的基本知識
了解進程間通信的基本知識,如管道、UnixSocket、消息隊列、共享內存socket
了解SOCKET的基本操作如accept/connect、send/recv、close、listen、bind了解SOCKET的接收緩存區、發送緩存區、阻塞/非阻塞、超時等概念IO復用
了解select/poll/epoll
了解基於select/epoll實現的事件循環,Reactor模型了解可讀事件、可寫事件
TCP/IP網路協議
了解TCP/IP協議
了解TCP、UDP傳輸協議
調試工具
使用gdb調試Linux程序
使用strace跟蹤進程的系統調用
使用tcpmp跟蹤網路通信過程
其他Linux系統工具,如ps、lsof、top、vmstat、netstat、sar、ss等學習並理解一個新事務並不是一個容易的事情,特別對於swoole這種具備一定顛覆性的工具,要有耐心和實踐。
淡定的把手冊看完,遇到不理解的名詞學會使用搜索引擎學習,swoole的手冊其實是個大寶庫,網路開發常見的問題其實里邊都涉及到了。
㈦ 有哪些適合練手的PHP項目
1. 項目名稱:輕量級 B2C 商城系統
項目簡介:本項目是一個擁有 PC 端 + H5 移動端的超輕量,功能強大的 B2C 商城系統。
技術實現:
核心框架:基於全新超輕量高性能Speed框架
JS框架:jQuery 1.10.2
移動端JS框架:Zepto 1.2.0
圖表庫:Flot 0.8.3
富文本編輯器:網路 精簡版 UMeditor
JS模板引擎:Juicer 0.6.8
運行環境:
操作系統: Windows / Linux / Unix
Web 伺服器:Apache / Nginx / IIS
PHP 版本:5.2 及以上
MySQL 版本:5.0 及以上
生產環境推薦:Linux + Nginx + PHP5.5 + MySQL5.6
項目地址:cigery/verydows - 碼雲
2、項目名稱:基於 PHP 的輕量級路由器
項目簡介:非常輕量級的路由器。無依賴、簡潔、速度快、自定義性強。
輕量級且速度快,查找速度不受路由數量的影響。
支持路由參數定義,以及路由選項(比如設定 domains、schema 等檢查限制)。
支持請求方法:GET POST PUT DELETE HEAD OPTIONS ...
支持事件: found notFound execStart execEnd execError,當觸發事件時你可以做一些事情(比如記錄日誌等)。
支持動態獲取 action 名。支持設置方法執行器(actionExecutor),通過方法執行器來自定義調用真實請求方法。
支持自動匹配路由到控制器就像 yii 一樣,請參看配置項 autoRoute。
支持通過方法 SRouter::dispatch($path, $method) 手動調度一個路由。
你也可以不配置任何東西,它也能很好的工作。
項目地址:inhere/php-srouter - 碼雲
3. 項目名稱:輕量級論壇社區系統
項目簡介:本項目是一個基於 CodeIgniter 框架開發的 PHP 新型社區系統,她輕量小巧、簡單易用、強大高效,又簡稱 」STB(燒餅 BBS)。
項目地址:燒餅/startbbs - 碼雲
4. 項目名稱:基於 PHP 的三維驗證碼
<img src="https://pic2.mg.com/50/v2-_hd.png" data-rawwidth="360" data-rawheight="80" class="content_image" width="360">
項目簡介:打破傳統的,基於 PHP 的 3d 英文字母驗證碼,圖片粒子化,機器難以識別邊界,破解難度極大。
項目地址:Quekie/Safe 3D Identifying Code
5. 項目名稱:基於 PHP 的多進程網路爬蟲框架
<img src="https://pic4.mg.com/50/v2-_hd.jpg" data-rawwidth="650" data-rawheight="800" class="origin_image zh-lightbox-thumb" width="650" data-original="https://pic4.mg.com/v2-_r.jpg">
項目簡介:Beanbun 是一個簡單可擴展的爬蟲框架,支持分布式,支持守護進程模式與普通模式,守護進程模式基於 Workerman,下載器基於 Guzzle。
特點:
支持守護進程與普通兩種模式(守護進程模式只支持 Linux 伺服器)
默認使用 guzzle 進行爬取
支持分布式
支持內存、Redis 等多種隊列方式
支持自定義URI過濾
支持廣度優先和深度優先兩種爬取方式
遵循 PSR-4 標准
爬取網頁分為多步,每步均支持自定義動作(如添加代理、修改 user-agent 等)
靈活的擴展機制,可方便的為框架製作插件:自定義隊列、自定義爬取方式...
項目地址:Kiddyu/Beanbun - 碼雲
㈧ HDwiki架構
MVC
php是嵌入式語言,最簡單但也是最繁瑣的就是php和html嵌套著寫,開發維護絕對能讓人產生暴力沖動.所以HDwiki採用了mvc模式,可以方便開發人員分工協作,提高開發效率,增強程序的可維護性和擴展性,而且還利用Controller將Model與View分離,降低它們之間的耦合度.
HDwiki中,一個請求發過來後(如index.php?doc-view-1),調度控制器(hdwiki.class.php) 會根據請求決定由哪個控制器的哪個方法去處理,本例中是doc這個控制器的doview方法去處理,這個控制器文件便是/control/doc.php,doc這個控制器的doview方法負責處理業務部分(比如數據校驗,業務邏輯),調用模型(model)和視圖(view).模型主要是根據要求取的數據,可以是從資料庫去,也可是是從文件中去,還可以是從內存中去,歸根到底一句話,根據業務邏輯處理數據.而視圖就是要將我們處理好的數據顯示出來,控制器將要顯示的數據發給視圖,視圖根據要求就將顯示的樣式,html代碼,要顯示的數據處理成一個模板文件,最後顯示出來.這樣一個請求便處理完了.可能會有哥們要問了,為什麼能根據index.php?doc-view-1能知道控制器是哪個,方法是哪個?這就是我們要說的下一個關鍵詞---URL
URL
HDwiki中的url形式為index.php?doc-view-1,index.php是所有請求的唯一入口,query_string以"-"分割,第一個doc表示調用的控制器文件,路徑是/control/doc.php,第二個"view"是要調用的控制器的方法doview,後面的參數"1"(或者更多的參數)均是doview方法中需要的參數,順序是自定義的,等等,url中明明是view,怎麼調用的是doview方法呢?在hdwiki系統里可以從url中知道要訪問的方法名稱,但是如果control中有方法不想被url直接訪問,也就要區分開,所以需要在所有url中集中處理,能被直接訪問的統一加do.
許可權
HDwiki的許可權可能是最獨樹一幟的,每個用戶的是否有訪問許可權完全根據url來判斷.我們給用戶分組,比方說管理員組,詞條管理員組,普通用戶組,匿名組等,每個組都有一坨的可訪問的url列表,你在哪個組,你就只能訪問那些url,也就是那些應用,每個url都是一個許可權控制.你能訪問的url都會被控制.當然一個url中大家都可以看,但是有部分是有限制的,這就需要做點點調整,比如匿名用戶看到的是"請登錄",登錄用戶看到的是"退出",這個我們就會輔助以用戶組id來判斷.
標簽
hdwiki的標簽功能能讓站長和開發者更方便快捷的添加要顯示的各種數據,基本表現形式是在頁面中添加例如 {hdwiki:docnumber /}的數據,便能顯示總詞條數.其原理也很簡單,就是根據標簽正則匹配,然後調用相應的方法去調用數據,當然,每個標簽要調用的方法都已經寫好了全部保存在model/tag.class.php中,以{hdwiki:docnumber /}為例,當調用頁面時,它被解析成$_ENV['tag']->docnumber(),而這段代碼便是去調用/model/tag.class.php的docnumber這個方法,這個方法便調出總詞條數的數值.這樣,只要在tag.class.php中存在的方法,就可以在任何頁面調用了.
㈨ 怎麼在thinkphp添加數據時獲取自動增長的id
下面是TP5的方法,TP3的在添加後變數直接就獲取了。添加數據後如果需要返回新增數據的自增主鍵,可以使用 getLastInsID 方法:
Db::name('user')->insert($data);
$userId = Db::name('user')->getLastInsID();或者直接使用 insertGetId 方法新增數據並返回主鍵值:
Db::name('user')->insertGetId($data);
㈩ 各種語言寫網路爬蟲有什麼優點缺點
我用 PHP 和 Python 都寫過爬蟲和正文提取程序。
最開始使用 PHP 所以先說說 PHP 的優點:
1.語言比較簡單,PHP 是非常隨意的一種語言。寫起來容易讓你把精力放在你要做的事情上,而不是各種語法規則等等。
2.各種功能模塊齊全,這里分兩部分:
1.網頁下載:curl 等擴展庫;
2.文檔解析:dom、xpath、tidy、各種轉碼工具,可能跟題主的問題不太一樣,我的爬蟲需要提取正文,所以需要很復雜的文本處理,所以各種方便的文本處理工具是我的大愛。;
總之容易上手。
缺點:
1.並發處理能力較弱:由於當時 PHP 沒有線程、進程功能,要想實現並發需要借用多路服用模型,PHP 使用的是 select 模型。實現其來比較麻煩,可能是因為水平問題我的程序經常出現一些錯誤,導致漏抓。
再說說 Python:
優點:
1.各種爬蟲框架,方便高效的下載網頁;
2.多線程、進程模型成熟穩定,爬蟲是一個典型的多任務處理場景,請求頁面時會有較長的延遲,總體來說更多的是等待。多線程或進程會更優化程序效率,提升整個系統下載和分析能力。
3.GAE 的支持,當初寫爬蟲的時候剛剛有 GAE,而且只支持 Python ,利用 GAE 創建的爬蟲幾乎免費,最多的時候我有近千個應用實例在工作。
缺點:
1.對不規范 HTML 適應能力差:舉個例子,如果一個頁面裡面同時有 GB18030 字元集的中文和 UTF-8 字元集的中文,Python 處理起來就沒有 PHP 那麼簡單,你自己需要做很多的判斷工作。當然這是提取正文時的麻煩。
Java 和 C++ 當時也考察過,相對腳本語言比較麻煩,所以放棄。
總之,如果開發一個小規模的爬蟲腳本語言是個各方面比較有優勢的語言。如果要開發一個復雜的爬蟲系統可能 Java 是個增加選項, C++ 我感覺寫個模塊之類的更加適合。對於一個爬蟲系統來說,下載和內文解析只是基本的兩個功能。真正好的系統還包括完善的任務調度、監控、存儲、頁面數據保存和更新邏輯、排重等等。爬蟲是一個耗費帶寬的應用,好的設計會節約大量的帶寬和伺服器資源,並且好壞差距很大。