2017年3月31日 星期五

php 計數器

貌似入門程式,都喜歡以計數器做為初級運用,看似簡單(不就是數字增加或減少而已),但其中卻隱藏了許多程式中的基本概念,它真的簡單嗎?小學生不那麼認為。
舉凡計數器較有名氣的如 Google analytics 、alexa 都是赫赫有名的計數器程式,寫程式可以寫到像這樣用來賺錢的,也算是一種專業吧!(嚴格來講,我們只是賣麵的...)
我們先來看看計數器的大略思考模式,再來研究寫法吧!先看思路,如下圖所示:
由上圖來看,我們大略分成兩段,第一段為匹婆(people 或 user )到程式頁面這段,這段在程式碼而言會比較複雜,所以我們不談這段(程式可慢慢增加,以後你可以自己增加)。後面這段,程式到資料庫(或記錄檔)這段,是我們要探討的,小學生會先寫出一碗陽春麵程式,然後慢慢添加功能上去,程式碼不會寫的很複雜,讓我們開始吧!

首先,我們先建立一程式頁面 index.php 及一文字檔案 count.txt 於相同的資料夾下,接著使用 Notepad++ 將 count.txt 文件打開,輸入數字 0 後儲存檔案。
index.php 程式碼如下:
將 index.php 內容貼入上述程式碼後請記得以 utf-8存檔(避免亂碼),打開瀏覽器後網址輸入你的程式所在位置,好比 http://127.0.0.1/count/index.php ,基本上這程式已經有了基本的計數功能,按鍵盤 F5 會看到數值遞增的效果,我們將此程式分成幾個部份來解釋:
  • 第一部份:設定檔部份,(第2行到第7行)
    通常寫程式我們應該養成一種習慣,使用設定檔,以後若要修改數據,就不必每個程式翻開來修改參數了,比如 $mun = file($count_dat)  這行,若是寫成 $mun = file('count.txt') 這樣當然也是可執行,但想想,假如以後程式碼越加越多,頁面越來越多時,有天突然要修改個檔案名稱,是否會變的很麻煩而且容易出垂?很多大型專案,大部份會把設定檔寫在一個檔案內如:config.php ,然後讓其他程式直接調用此檔案內的參數,尤其是多人共同開發一個專案時,更是會使用這種方式。
  • 第二部份:讀檔部份(第 9 行到第 18 行),這幾行主要就是讀取檔案內的數據,這幾行看起來好像沒什麼特別,但小學生告訴你,危機就是這幾行,你可以先研究看看為什麼?後面小學生再解釋給你聽。
  • 第三部份:寫檔部份(20 行到 33 行),這裡我們先假如狀況,$mun 陣列若是在不可預期的狀況中,剛好沒有讀取到完整的資料,所以我們為了確保此問題發生,先做個判斷式,驗證 $mun[0] 數據是否不為空值,並且要大於或等於數字 0(當然你可以自行做更多驗證,但小學生現在在煮陽春麵....所以就這樣而已!)。
  • 第四部份:不可預期現象的發生(34 行到 36 行),基本上是補充上一部份發生的不可預期後的現象,告知瀏覽者。
  • 現在我們回頭來研究第二部份的程式碼,重點在這一行的擺放位置
    $mun = file($count_dat);
    它負責讀取檔案內容,把內容放進 $mun 陣列中(當然你也可以使用 file_get_contents() 或是 fread() 指令啦!),倘若你將此行放在未鎖住檔案之前的任何位置(當然要在設定檔後面),程式仍舊是可進行讀取的,但這樣程式就容易出問題了,原因出在,倘若你在進行讀檔的那一瞬間,檔案剛好被其他使用者開啟,此時檔案會被清空,那麼,當下讀取的資料內容就是不正確的數據了(計數器莫名其妙歸0 問題點通常發生在這裡),因為此檔案在程式中會被讀取,也會被寫入,這一寫一讀,當動作頻繁後,就會出垂了,有想通了嗎?
    ※此程式若你直接加入 sleep(10) ,讓程式模擬多線程,應該還是不會讓數字亂跳,因為有第三部份的判斷式來做預防,若此部份你不是很明白,請看php fopen 開啟建立檔案

上面的範例,基本上應該已算是陽春的計數器了,不過嚴格講起來,只能給 90 分(後面的 0 是自己加上去的),還記得剛剛我們自行創建的 count.txt 檔案,並且自行加個數字 0 上去這段過程嗎?
這部份我們來添加進去程式吧!讓程式自行檢測,並且自動產生此檔。程式碼再進化,變成下面代碼:

上面這段程式碼,僅是添加了自動產生記錄檔的功能( 9 ~36行),為了讓讀者能夠看懂,所以小學生把它獨立成一部份,全部擠在一堆沒分段的話,初學者應該蠻難適應的吧?!(當然萬中獨一的碼農是例外,不過這種高手應該不會來看小學生的文章。。。 😥 ),這段程式碼主要的功能是在檢測是否記錄檔有存在,若不存在,系統會自動建立記錄檔在相同的資料夾位置處,這樣我們就省去一開始自建記錄檔的動作了,若有一天,程式給了別人測試,也不會因為記錄檔的問題而出錯了!這程式又比剛剛稍微好些了!

若上述讀者都能力理解,我們再把程式碼,搬移到適當位置,變成下面這樣:
事實上,上面兩段程式碼內容是一模一樣的(程式沒動作那段,並沒結束程式或做其他動作,因此程式會再往下執行,所以兩段程式碼是一樣的,只是位置略不同),小學生僅是做了這樣的處理而已:


以上的代碼,若讀者有辦法理解,基本上,這個計數器應該有達到及格分數了吧(自我安慰中),接著我們再來進化程式,把程式給它圖形化和固定數字元數(好比固定顯示7位數,當然前面的不足位元數,要將它填充數字 0 ,舉例:7 會變成 0000007 七位數,1234 會變成 0001234,若為七位數,則直接顯示如:9487945)
程式碼的點綴。。。基本上,這裡可能要帶點美工天份(很遺憾的是。。。小學生號稱「狗啃的美工」),無法做出漂亮頁面,至於美工部份。。請忍著看吧。。。
源碼再進化:
上面程式碼,我們在設定檔部份,添加了 8~11行這幾項功能進去,看第 11 行的設定值,這裡小學生是用相對路徑,因此讀者必須自建 image/1/  這個資料夾(這些都可以用程式寫出來拉,只是程式碼會太長,這部份我們就手動做吧),資料夾內,你必須放數字圖檔 0~9(0,1,2,3,4,5,6,7,8,9),這樣設定秀圖時,才可看到圖片唷!
從 41 行到 73 行是我們後來增加的代碼,主要就是執行設定檔 8~11行的功能,每一段小學生都有註解文字說明,相信不難理解,當然後面要再增加哪些功能,就看讀者自己囉!基本的東東,小學生應該也都教給你囉!希望你可以吸收進去唷!在下載的資料夾內,小學生有準備 3 種圖檔,只須修改設定檔,$image_path 此參數後的路徑就可以看到變化!請自行試試吧!
程式是要自己動手去做的,不是用眼睛看的就會懂的!
引用資料來源:https://scriptmarks.com/php-計數器/



沒有留言:

張貼留言

注意:只有此網誌的成員可以留言。

cas server 一直圈圈或取得狀態異常

重點: cas server 不能開 VPN,會造成取的來源 dns 異常,會一直轉圈圈或等很久。