[閒聊] 關於建帳號的程式,大家如何理解
我手上有一支同事寫的程式讓我學習,我們是用 CakePHP,寫 web 2.0 規格
這個網站有建帳號的動作
當 user 點了建帳號的要求之後,我們導向建帳號的網址
http://localhost/user/create
為了避免被機械人大量建立帳號,我們有利用程式產生一張圖
user 必需讀這張圖裏面的字,打在 form 裏面傳回
這樣的做法還算經典,常見吧..
所以 function create 裏有呼叫一個產生圖的程式,該程式其實是另一個內部網址
http://localhost/random
使用這個網址,就可以繪出一張圖,並且傳回圖內的密碼
當 create function 被呼叫時,它內部才去呼叫 function random 繪圖
random 必需執行完畢,我們才知道這次產生了什麼密碼
而 create function 在按下 submit 後我才能從 POST 變數裏取回 user 看到的值
兩值相等則允許 user 註冊
我曾質疑同事:
random 返回時就有值了,在 submit 跳轉後比較兩值並沒有困難
為什麼繞一大圈,還必需把值儲存在外部
同事說:
ramdom 的返回值怎麼取得?那是一個網址,網址有 return value 嗎?
我們可以把 return value 存在檔案裏,但同時有很多人註冊怎麼辦?互相蓋寫?
這裏我們可以看到,兩個網頁間有互動關係
http://localhost/user/create 會去呼叫 http://localhost/random
( 大概就是有一段 <img src='random'> 這樣搞出來的 )
但是 random 的傳回值必需先出現,儲存,且能分辨不同 session,
create 才能再往下執行
也許我們可以寫出沒互動關係的程式來
但當合作對象弄出這種東西
我也是被迫接受呀..
然後我就開始想像兩個不同網址間怎麼傳遞變數溝通
比如利用 session 內的變數,也許是個好方法
而兩個不同網址如果可以想像成兩個 thread,其實一下就了解了
如果想像成副程式,我會認為 random 要返回後,create 網頁才能顯示
而我也一直以為既然 random 要返回,怎麼不直接把值傳回 caller 網頁呢?
但其實不是,辦不到
create 網頁一下就顯示了,然後才慢慢的補其他沒抓完的圖,包括 random
(就好像相簿網頁,網頁本身一下就顯示完了,然後 img src 還繼續抓其他圖補進來)
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.59.179.152
推
05/20 01:10, , 1F
05/20 01:10, 1F
→
05/20 01:11, , 2F
05/20 01:11, 2F
→
05/20 01:12, , 3F
05/20 01:12, 3F
→
05/20 01:13, , 4F
05/20 01:13, 4F
→
05/20 01:14, , 5F
05/20 01:14, 5F
→
05/20 01:15, , 6F
05/20 01:15, 6F
→
05/20 01:15, , 7F
05/20 01:15, 7F
→
05/20 01:15, , 8F
05/20 01:15, 8F
→
05/20 01:16, , 9F
05/20 01:16, 9F
→
05/20 01:16, , 10F
05/20 01:16, 10F
→
05/20 01:17, , 11F
05/20 01:17, 11F
→
05/20 01:17, , 12F
05/20 01:17, 12F
→
05/20 01:20, , 13F
05/20 01:20, 13F
→
05/20 01:20, , 14F
05/20 01:20, 14F
→
05/20 01:21, , 15F
05/20 01:21, 15F
推
05/20 01:22, , 16F
05/20 01:22, 16F
→
05/20 01:27, , 17F
05/20 01:27, 17F
→
05/20 01:28, , 18F
05/20 01:28, 18F
→
05/20 01:28, , 19F
05/20 01:28, 19F
→
05/20 01:29, , 20F
05/20 01:29, 20F
→
05/20 01:31, , 21F
05/20 01:31, 21F
→
05/20 01:31, , 22F
05/20 01:31, 22F
→
05/20 01:32, , 23F
05/20 01:32, 23F
推
05/20 01:33, , 24F
05/20 01:33, 24F
→
05/20 01:33, , 25F
05/20 01:33, 25F
→
05/20 01:33, , 26F
05/20 01:33, 26F
→
05/20 01:34, , 27F
05/20 01:34, 27F
→
05/20 01:34, , 28F
05/20 01:34, 28F
→
05/20 01:34, , 29F
05/20 01:34, 29F
→
05/20 01:35, , 30F
05/20 01:35, 30F
→
05/20 01:35, , 31F
05/20 01:35, 31F
→
05/20 01:36, , 32F
05/20 01:36, 32F
→
05/20 01:36, , 33F
05/20 01:36, 33F
→
05/20 01:36, , 34F
05/20 01:36, 34F
→
05/20 01:36, , 35F
05/20 01:36, 35F
→
05/20 01:37, , 36F
05/20 01:37, 36F
→
05/20 01:38, , 37F
05/20 01:38, 37F
→
05/20 01:38, , 38F
05/20 01:38, 38F
→
05/20 01:38, , 39F
05/20 01:38, 39F
還有 95 則推文
還有 1 段內文
推
05/20 11:43, , 135F
05/20 11:43, 135F
→
05/20 11:43, , 136F
05/20 11:43, 136F
→
05/20 11:48, , 137F
05/20 11:48, 137F
→
05/20 11:49, , 138F
05/20 11:49, 138F
→
05/20 20:35, , 139F
05/20 20:35, 139F
前面才想通,第一個網頁內部用 img src 呼叫第二個網頁,不會有叉燒包的問題
但是等待第二個網頁完成卻的確會是問題;只是不嚴重
比如,如果我很在乎連縮圖都不存在,你就根本不能建帳號的話
那麼 OK 鍵應該要 disable
說不嚴重是因為,user 不可能沒看到圖就猜鍵值
就算猜了按 OK,我回應他猜錯了重來也就算了
(真要解的話,就是同步;想得到的利用 js 及變數等等其實充滿同步的精神)
總之,這樣的問題存不存在,多少是有
也能用 multi-thread 的概念來思考
計較的話就不說這個叫 thread 了
比如兩輛車同時從台中到台北,我不是說寫這樣的程式,只是說現實世界這樣一件事
然後這兩輛車為了車隊,為了協調,我可能就借用這樣的字眼了
字眼只是字眼罷了
一個網頁開啟,因為可以一直在內部用 link 向外連
其實這樣的問題比單機板常見很多啊
一個網頁沒開好,停止是小事
開到一半已經開始寫資料留殘渣就是大事
(用在交易,搞不好已付款但無法交貨 XD)
一直有碰到啊..
※ 編輯: HuangJC 來自: 61.219.65.16 (05/20 20:43)
→
05/21 14:12, , 140F
05/21 14:12, 140F
→
05/21 14:18, , 141F
05/21 14:18, 141F
→
05/21 14:23, , 142F
05/21 14:23, 142F
→
05/21 14:23, , 143F
05/21 14:23, 143F
→
05/21 14:23, , 144F
05/21 14:23, 144F
→
05/21 14:24, , 145F
05/21 14:24, 145F
推
05/21 14:25, , 146F
05/21 14:25, 146F
→
05/21 18:00, , 147F
05/21 18:00, 147F
→
05/21 18:00, , 148F
05/21 18:00, 148F
→
05/21 19:13, , 149F
05/21 19:13, 149F
→
05/21 19:13, , 150F
05/21 19:13, 150F
→
05/21 19:14, , 151F
05/21 19:14, 151F
→
05/21 19:14, , 152F
05/21 19:14, 152F
說很簡單就來看看更簡單的吧!
int *p=new int; //其值不重要,我只是想交代有這樣一個指標
void del(){
delete p; //我把它刪除
p=new int; //再把它的空間產生
//繼續 use p
}
以上,是很簡單的程式
但如果 p 的值別人有用,就有危險
當 p 被刪除成為無效指標時,另一個 thread 有可能來存取,產生錯誤
因此如上的撰寫風格適用在 single-thread
當有風險時,需另外改寫
{
int *p1=p;
p=new int;//直接產生新空間並指定其值,別問我幹麻不續用舊空間,這只是例子
delete p1;//刪除舊空間
}
這麼一小段程式裏,示範了如何迴避 multi-thread 裏的風險
不必拘於於這是 C code,觀念只是觀念,換別種語言一樣可用
所謂的 multi-thread 並不是說一定要見到 create thread 這種指令
如果你要這樣講,我就換個字眼和你談; multi-process,task,..
總之最嚴格的定義當然會先說什麼叫 'thread',但其實它的觀念到處可見,也不叫難
只是你必需不斷的迴避風險而已
如果用原程式,那麼很簡單的就是'我用的資源,無論如何不讓別人同時存取'
知道 multi-thread 只是知道這種事而已,而書上有時就像我一樣,舉的例很短,不到十行
要先把它講成很難,再說我想太多..怕是在網路端反而想太少吧..
※ 編輯: HuangJC 來自: 61.219.65.16 (05/21 19:26)
→
05/21 19:49, , 153F
05/21 19:49, 153F
→
05/21 20:03, , 154F
05/21 20:03, 154F
→
05/21 20:03, , 155F
05/21 20:03, 155F
你自己知道這些問題,只是愛用別的字眼,這不過是 RD 的通病
昨天 w 兄還質疑 captcha 我同事怎麼這麼寫,說 SA 混哪裏去了
結果找到的經典還不是一樣這麼寫?
有自己的想法,要蓋掉別人程式當然做得到
是'都對',而不是'只有我對'
我一直不懷疑用另一套邏輯寫程式
但我不認為別人的一定錯了
沒這樣的態度,那怎麼看我,我也不覺得奇怪了
※ 編輯: HuangJC 來自: 61.219.65.16 (05/21 20:55)
推
05/21 20:59, , 156F
05/21 20:59, 156F
你可以回去找舊文呀
網友隨便一搜尋就有 sample,我同事做法一模一樣
而這一模一樣的就被你批評'SA 混到哪去了'
這不就證明,你不會欣賞別人程式,喜歡把別人想法蓋掉嗎?
→
05/21 21:00, , 157F
05/21 21:00, 157F
→
05/21 21:01, , 158F
05/21 21:01, 158F
→
05/21 22:20, , 159F
05/21 22:20, 159F
→
05/21 22:21, , 160F
05/21 22:21, 160F
→
05/21 22:22, , 161F
05/21 22:22, 161F
→
05/21 22:22, , 162F
05/21 22:22, 162F
→
05/21 22:22, , 163F
05/21 22:22, 163F
推
05/21 22:33, , 164F
05/21 22:33, 164F
→
05/21 22:33, , 165F
05/21 22:33, 165F
我熟不熟和你提的對不對有何關係?
是你在我們 multi-server 上,又硬要實現你原本的想法,才開始繞圈圈
→
05/21 22:33, , 166F
05/21 22:33, 166F
→
05/21 22:34, , 167F
05/21 22:34, 167F
→
05/21 22:34, , 168F
05/21 22:34, 168F
我也怕和你再談了
因為你欣賞別人少,嘲笑別人多..
對旁觀第三者而言,只覺得在大系統下鑽這小小的 captcha 會不會太浪費時間了
要不要聽聽這種講法
'你想的也許對,有空時寫個 sample 來測試一下':這是我同事說的
'你好像很喜歡用XXXXX':這是你的語氣
唔..你最行
我還是要講我前主管,他就把別人程式蓋掉,被蓋的馬上就離職了
別人真的不會寫?只不過寫法不同而已吧..
你參考看看
※ 編輯: HuangJC 來自: 61.219.65.16 (05/21 22:46)
PHP 近期熱門文章
PTT數位生活區 即時熱門文章