看板 PHP 關於我們 聯絡資訊
我手上有一支同事寫的程式讓我學習,我們是用 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
w3c :為啥要用在兩隻程式上呀 .. create的頁面 05/20 01:10
w3c :自已就可以用GD產生縮圖,自已決定random值是多少呀 05/20 01:11
w3c :如果硬要分兩支程式來做 ~ 我還是會選擇由create頁面 05/20 01:12
w3c :產生random值 告訴另一支程式產生圖檔 05/20 01:13
w3c :這跟multi-thread有啥關聯呢? QQ 05/20 01:14
w3c :我怎麼覺得 我在結帳上做的progressbar還比較像 QQ 05/20 01:15
gpmm : w 大,真的算了,這已經是走火入魔混淆亂用了… 05/20 01:15
gpmm :從最早一開始就已經是這樣,把各種觀念拉混在一起 05/20 01:15
w3c :client的pg-bar 跟另一支程序處理資料的進度同步更新 05/20 01:16
gpmm :不相干的理解也可以抓來抓去用 05/20 01:16
w3c :gpmm大 我剛是想打住呀 ~ 可是他就在發文了 05/20 01:17
w3c :還寫了將近半個小時 XD 05/20 01:17
gpmm :由他去吧,我也藉 H 大的文章磨練耐性好段時間了 XD 05/20 01:20
gpmm :已經數不清幾次衝動的想回文,卻又想想於是又放下 05/20 01:20
gpmm :咦?儼然變成閒話家常? XDD 05/20 01:21
w3c :H 大 其實也是熱心的人啦 ~ 就聊聊吧 XD 05/20 01:22
HuangJC :你就給我一段 sample code 用單一程式完成吧.. 05/20 01:27
HuangJC :另外,大型專案裏,同事丟什麼副程式給你就要用,沒得選 05/20 01:28
HuangJC :擇;我會不得已研究前景背景多網頁架構,是 PayPal逼的 05/20 01:28
HuangJC :除非我寫結帳時不用 PayPal,否則這架構是非用不可 05/20 01:29
HuangJC :搞不好也有高手說 w 兄的 progressbar 不必同步來做 05/20 01:31
HuangJC :但如果他和你合作,他就要用這樣的架構,不是嗎? 05/20 01:31
HuangJC :寫程式絕對不只一種寫法,但別人有主導權時,也只好跟. 05/20 01:32
w3c :SA幹嘛去了 ~ 怎麼會降子分配大型專案呀 05/20 01:33
w3c :我說的progressbar 在結帳過程是分好幾個STEP 05/20 01:33
HuangJC :另外,我同事有提到,他不想讓密碼值在 POST,GET 間飄 05/20 01:33
w3c :在畫面的部份 ~ 還要同時得知結帳過程到哪個STEP 05/20 01:34
HuangJC :當然也不能在 HTML source 中飄;所以要藏好 05/20 01:34
w3c :...... RANDOM值只能存在一個檔案上 就可議了 05/20 01:34
w3c :頁面載入不能賦與一個雜湊值? 存的RANDOM由雜湊值命 05/20 01:35
w3c :名嗎? 05/20 01:35
w3c :更別說 為啥不能用sessions存? 05/20 01:36
HuangJC :其實我們用 DB 做;但講檔案也可以,總之多人註冊不能 05/20 01:36
HuangJC :互相覆蓋 05/20 01:36
w3c :方法就你說的 有很多種 ~ 甲跟乙配合專案 也不是只有 05/20 01:36
w3c :也要有個SA來協調吧 05/20 01:37
w3c :那意思一樣呀 ~ 就算存資料庫 不能由雜湊值當索引? 05/20 01:38
HuangJC :那個同事應該就是SA的身份了;如果這是決策,只好用了 05/20 01:38
w3c :一定要寫在同個欄位上? 05/20 01:38
HuangJC :我好奇的是為何要用'叫另個網址'來秀圖搞出這個麻煩 05/20 01:39
HuangJC :也許可以用 echo binary的方式直接秀圖? 05/20 01:39
w3c :呃 ~ 我看你跟你同事好好協調好了 @@ 05/20 01:40
HuangJC :如果說,秀一張圖只有 img src 好用,那當然是另個網址 05/20 01:40
HuangJC :沒什麼好協調的,他能寫 SAMPLE 給我學,我提不出別的 05/20 01:40
HuangJC :所以..至少他在時間內完成專案了 05/20 01:41
w3c :他是懶得存檔 直接用header送出吧 = = 05/20 01:41
HuangJC :phpbb 有這段 code,有空我 trace 一下別人的做法好了 05/20 01:42
HuangJC :對,有 header,然後再 imagejpeg() 05/20 01:44
HuangJC :如果我 img src=tmp file name,而tmp file 產生太慢 05/20 01:45
HuangJC :那會不會在 random 的圖示上看到叉燒包? 05/20 01:45
HuangJC :所以另一個方法是給圖一個 ID,然後用 js 把圖換掉.. 05/20 01:46
HuangJC :這樣或許不會有其他問題;不過他另一個主張很有趣: 05/20 01:47
HuangJC :少用 js,因為 debug 困難.他是寫好的深受其害吧.. 05/20 01:47
w3c :我 .. 不知道要怎麼回你 ~ 就算是原本的 如果產生縮 05/20 01:50
w3c :圖的那支程式 ~ 他timeout掉了 是不是也叉燒包 = = 05/20 01:50
HuangJC :那在你腦袋裏怎麼不會時時有兩個排程在競速呢? 05/20 01:51
HuangJC :當然是自然而然一直理解並排除這些問題呀 05/20 01:52
w3c :..... imagejpeg是不會回值bool值嗎? = = 05/20 01:52
w3c :你是沒辦法在一隻程式上 容錯嗎? 05/20 01:52
w3c :有錯誤,是不是該例外處理呢? 05/20 01:53
w3c :例外處理的方式呢? 05/20 01:54
w3c :寫程式時 為啥首重的在流程 05/20 01:54
w3c :在編流程的時候 ~ 這些是不是也是考慮的問題之一呢 05/20 01:54
<?php $TmpFile=Random(); ?> <img src=' <?= $TmpFile ?> 好像可以..這樣一定先執行完 Random 才秀圖 而密碼值要另外傳回,比如 其實傳回 array array { $TmpFile, $Code } 然後這個 $Code 放進 session 變數裏,方便重進入這一頁時引用 (很多程式都是重進入同一頁,畢竟比對密碼出錯也還是留在 create 頁面) ※ 編輯: HuangJC 來自: 61.59.179.152 (05/20 01:59)
HuangJC :基本上,思路到哪裏就用哪種做法,是儘力完成自己最習 05/20 02:03
HuangJC :慣的 style 吧.和很多 RD 合作過的感想..每個人都以 05/20 02:03
HuangJC :為把別人的做法換掉會比較順..所以才會爆肝 05/20 02:03
HuangJC :因為,想換掉別人做法,就要連別人那份都改寫掉 05/20 02:04
w3c :coding久了 都會有自已的作法,把別人的換掉不見得比 05/20 02:04
w3c :較麻煩 05/20 02:04
w3c :程式 不管怎麼寫 ~ 流程圖 一定最相近 05/20 02:04
w3c :溝通不良 ~ 可以畫流程圖做溝通 會比較好 05/20 02:05
HuangJC :前同事的確把另一位的換掉,被換掉的氣得離職了.. 05/20 02:05
w3c :我去忙了 ~ 掰 @@ 05/20 02:06
HuangJC :科科~ 05/20 02:06
HuangJC :我不給釣竿,就是不換掉別人的做法;發問者不管提出什 05/20 02:07
HuangJC :麼想法,他怎麼想我就怎麼教;所以比如密碼蓋寫的問題 05/20 02:07
HuangJC :如果他自己說可以用 session,我就教 session;他自己 05/20 02:08
HuangJC :說可以用DB,我就教DB;因為符合自己想法的會比較順 05/20 02:08
HuangJC :如果要換掉..我會一路把他像 framework 一樣全換掉 05/20 02:08
chrisQQ :是我想的太簡單嘛?不就 $code = random(); 05/20 02:17
chrisQQ :$_SESSION['code'] = $code; 在用 $code 去產生圖? 05/20 02:18
chrisQQ :SESSION 的用法就是使用者獨立… 依照 PHPSESSID 個 05/20 02:20
chrisQQ :別存在該 PHPSESSID 的檔案或是 DB 中不是嘛@@? 05/20 02:20
HuangJC :其實我也發信去問他了,為何要把造縮圖放在一個網址中 05/20 02:24
HuangJC :不過他的回答也許是'都可以,但程式已經寫好了' 05/20 02:25
HuangJC :如果你寫程式沒他快,其實很難質疑他為什麼沒寫到最好 05/20 02:25
chrisQQ :呃,我還是不懂問題點在哪,是我太笨嘛= = 這不就 05/20 02:29
chrisQQ :google://php 驗證碼 例:http://37w.3b8.cc 05/20 02:31
chrisQQ :這個範例的流程不就是一般大多數的作法,有什麼問題 05/20 02:31
chrisQQ :嘛?如果有問題的話我也想知道耶… 我用好久了… 05/20 02:32
chrisQQ :圖片產生 timeout/error 就在加一個重新產生的按鈕 05/20 02:33
HuangJC :你這個仍然是兩個網頁的做法,所以差別只在 db 改成了 05/20 02:41
HuangJC :session 05/20 02:41
HuangJC :其實我很愛用 session,我覺得少了 db 的 loading 05/20 02:42
HuangJC :一般看別人 sample 可能會忘了它的巧妙處,如果自己有 05/20 02:43
HuangJC :新題目拿來寫,才會撞到以為不會出錯的問題.. 05/20 02:43
chrisQQ :php 裡面要「輸出圖片」一定要兩個網頁才能做吧? 05/20 02:44
chrisQQ :如果你堅持要「一個檔案」,那頂多是寫在同一個檔案 05/20 02:44
HuangJC :所以比如,我在產生縮圖的網頁裏加 delay,強迫產生叉 05/20 02:44
HuangJC :燒包,你才會發現問題;而我剛提的架構倒可以強制順序 05/20 02:45
chrisQQ :然後 img src 的時候引用自己… 呃,我想不到要產生 05/20 02:45
HuangJC :因為 PHP 由上往下執行,所以縮圖存檔後才產生 HTML 05/20 02:46
chrisQQ :圖,但卻只用單一個網頁來做的解法… 05/20 02:47
HuangJC :我還是用兩個檔案寫,只是我強迫了檔案的順序 05/20 02:47
HuangJC :反正.. html 裏用 http 調用另一個網址算常見,都要面 05/20 02:48
HuangJC :對類似的問題吧;如果你引用的網址還不存在,你怎麼辦 05/20 02:48
chrisQQ :產生縮圖的網頁加 delay 那頂多只是圖出來比較慢 05/20 02:48
chrisQQ :不然你也可以在圖產生之後在多一個變數來存圖產生好 05/20 02:49
chrisQQ :了,這樣註冊的時候先檢查圖到底有沒有產生好~ 05/20 02:49
HuangJC :嗯..的確只是圖出來比較慢而已;所以這不是好例子 05/20 02:51
chrisQQ :引用的網頁不存在難道有除了「程式寫錯」以外的原因? 05/20 02:52
chrisQQ :如果受到外來攻擊而檔案不見,那註冊機制也沒用了 :~ 05/20 02:53
HuangJC :同事用 DB 的原因回信了(他也是鬼,還沒睡),因為我們 05/20 02:53
HuangJC :是 multi-server 架構;得啦~ 這些 php 都不在同主機 05/20 02:54
HuangJC :不同主機不知有沒有 session,不過 DB 肯定好用.. 05/20 02:55
chrisQQ :session 可以存在 db... 不過不清楚多主機把 session 05/20 02:56
chrisQQ :存在同 db 的情況會是怎樣@@ 05/20 02:57
chrisQQ :btw 存 db 也還是要考慮 table lock 的問題… 05/20 02:57
chrisQQ :不過私心以為 把 random 和 create php 放不同主機 05/20 02:58
chrisQQ :是很奇怪的設計,呃,除非有另外的需求一定要這樣做 05/20 02:59
HuangJC :這同事做的是'保留彈性'的設計,而不是非得拆開 05/20 03:00
HuangJC :老實說,他矇中的機率還挺高的,只要一次不必大改架構 05/20 03:00
HuangJC :那他的彈性就讓人讚賞了 05/20 03:01
HuangJC :存 tmp 檔和 session 一樣,不保證跨主機,所以不存檔 05/20 03:10
HuangJC :而直接用 header 送出是對的;反而直覺存檔錯了 05/20 03:10
w3c :什麼multi-server .. 不管是NFS架構或是cluster 05/20 10:24
w3c :session共用 跟tmp檔共用都能做 ... 05/20 10:24
w3c :session共用不同網域可以靠memcache 同網域可以靠 05/20 10:25
w3c :session savehandler 把session的資料存在DB裡 05/20 10:28
w3c :TMP檔案的方式 可以掛載一個共用空間 來存放 .. 05/20 10:29
appleboy46 :我怎麼覺得一個簡單問題,可以想的這麼複雜?y 05/20 11:28
w3c :(聳肩) 05/20 11:30
bobju :你一定是太閒~ (-_-;) 05/20 11:42
bobju :言歸正傳.這上google打'captcha',就可以找到不少範例 05/20 11:43
w3c :哪裡閒 ... 昨晚我是邊coding邊回的 ... 0.0 05/20 11:43
bobju :看看別人是怎麼做的? 當然處理手法不止一種. 05/20 11:43
bobju :另外, captcha這東西有很大的商機存在,不過可能需要 05/20 11:48
bobju :更高的技術門檻. 05/20 11:49
HuangJC :其實問題還是在的,只是不算嚴重 05/20 20:35
前面才想通,第一個網頁內部用 img src 呼叫第二個網頁,不會有叉燒包的問題 但是等待第二個網頁完成卻的確會是問題;只是不嚴重 比如,如果我很在乎連縮圖都不存在,你就根本不能建帳號的話 那麼 OK 鍵應該要 disable 說不嚴重是因為,user 不可能沒看到圖就猜鍵值 就算猜了按 OK,我回應他猜錯了重來也就算了 (真要解的話,就是同步;想得到的利用 js 及變數等等其實充滿同步的精神) 總之,這樣的問題存不存在,多少是有 也能用 multi-thread 的概念來思考 計較的話就不說這個叫 thread 了 比如兩輛車同時從台中到台北,我不是說寫這樣的程式,只是說現實世界這樣一件事 然後這兩輛車為了車隊,為了協調,我可能就借用這樣的字眼了 字眼只是字眼罷了 一個網頁開啟,因為可以一直在內部用 link 向外連 其實這樣的問題比單機板常見很多啊 一個網頁沒開好,停止是小事 開到一半已經開始寫資料留殘渣就是大事 (用在交易,搞不好已付款但無法交貨 XD) 一直有碰到啊.. ※ 編輯: HuangJC 來自: 61.219.65.16 (05/20 20:43)
knockout :這是怎樣... 你去學FLASH的AS3好了 ~ 觀念不清嘛= = 05/21 14:12
HuangJC :這和 AS3 又有什麼關係了.. 05/21 14:18
knockout :網頁又不是保持連線的東西 ~ 哪來那麼多程序一直在 05/21 14:23
knockout :主機端進行的 05/21 14:23
knockout :你不如去學AS3 ~ keep alive的狀況下 ~ 你講的理論才 05/21 14:23
knockout :有必要性 05/21 14:24
knockout :明明就很簡單的東西 被你講的好像很複雜一樣 05/21 14:25
kylekai :樣子H根本沒搞清php session 是幹嘛的... 05/21 18:00
kylekai :只想這樣說而已. 觀念清楚就不會這麼多鬼問題... 05/21 18:00
HuangJC :這個例子當然是簡單的,不過舉例就是要舉簡單的例 05/21 19:13
HuangJC :另外,multi-thread 並沒規定一定有 while loop 05/21 19:13
HuangJC :一個 thread 呼叫另一個 thread,它很快結束,也是成立 05/21 19:14
HuangJC :對單一快速結束的程序而言,不就是在賭碰撞率嘛 05/21 19:14
說很簡單就來看看更簡單的吧! 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)
w3c :奇怪的劇情發展 呵呵 .... (繼續看戲) 05/21 19:49
gpmm :就算他拿 multi-thread 來解釋萬有引力和太空梭航道 05/21 20:03
gpmm :我也已經不覺得奇怪了… 05/21 20:03
你自己知道這些問題,只是愛用別的字眼,這不過是 RD 的通病 昨天 w 兄還質疑 captcha 我同事怎麼這麼寫,說 SA 混哪裏去了 結果找到的經典還不是一樣這麼寫? 有自己的想法,要蓋掉別人程式當然做得到 是'都對',而不是'只有我對' 我一直不懷疑用另一套邏輯寫程式 但我不認為別人的一定錯了 沒這樣的態度,那怎麼看我,我也不覺得奇怪了 ※ 編輯: HuangJC 來自: 61.219.65.16 (05/21 20:55)
w3c :找到的經典? ~ 啥鬼? 05/21 20:59
你可以回去找舊文呀 網友隨便一搜尋就有 sample,我同事做法一模一樣 而這一模一樣的就被你批評'SA 混到哪去了' 這不就證明,你不會欣賞別人程式,喜歡把別人想法蓋掉嗎?
w3c :我盡可能的建議了 ~ 我還很忙 ~ 別拖我下水 3Q 05/21 21:00
gpmm : w 大 XDDD 05/21 21:01
HuangJC :我還在公司,你說咧.. 05/21 22:20
HuangJC :為了你的想法,tmp file,結果搞出NFS架構或是cluster 05/21 22:21
HuangJC :有比較快嗎?不用DB用 session,結果 session 存回DB? 05/21 22:22
HuangJC :我不會去笑這叫繞一大圈,這是你的直覺,你的方便 05/21 22:22
HuangJC :我一向不主張蓋掉別人程式呀 :P 05/21 22:22
w3c :傻眼 ~ 我是舉你所謂的multi-server 一般常見的架構 05/21 22:33
w3c :提出解決方案 ~ 莫非 ~ 你連你們公司的主機架構都不 05/21 22:33
我熟不熟和你提的對不對有何關係? 是你在我們 multi-server 上,又硬要實現你原本的想法,才開始繞圈圈
w3c :熟嗎? ~ 什麼multi-server 聽不懂 OK ? 05/21 22:33
w3c :拜託 麻煩不要跟我雞同鴨講 ~ 這是我最後一次回你文 05/21 22:34
w3c :以上 05/21 22:34
我也怕和你再談了 因為你欣賞別人少,嘲笑別人多.. 對旁觀第三者而言,只覺得在大系統下鑽這小小的 captcha 會不會太浪費時間了 要不要聽聽這種講法 '你想的也許對,有空時寫個 sample 來測試一下':這是我同事說的 '你好像很喜歡用XXXXX':這是你的語氣 唔..你最行 我還是要講我前主管,他就把別人程式蓋掉,被蓋的馬上就離職了 別人真的不會寫?只不過寫法不同而已吧.. 你參考看看 ※ 編輯: HuangJC 來自: 61.219.65.16 (05/21 22:46)