來到1994年,終於知道為什麼80%的網站都在用PHP了!
昨天晚上写代码到深夜,一头扎到床上,沉沉睡去。
第二天睁开眼镜,我发现自己居然坐在一个咖啡馆里,旁边的墙上贴着最新的英文电影海报《阿甘正传》、《肖申克的救赎》
这都是1994年的经典电影,我意识到,自己穿越到了1994年的美国!
对面坐着一个帅哥,一边操作电脑,一边在不停地赞叹。
我探过头去,发现他正在看这个东西:
我说:“哥们儿,这不是安德森开发的Mosaic浏览器吗?这么丑,你怎么不用网景?”
“网景?那是什么东西?不过兄弟不简单啊,我在咖啡馆喝了这么多天的咖啡,你是第一个识货的,还知道安德森,肯定也是个程序员吧,要不一起干吧!”
“干什么啊?”
“浏览器绝对是互联网的未来,现在很多公司都在狂热地拥抱它, 他们就使用 Microsoft Word写文档,然后将文档保存为 HTML,通过 FTP 将它们放到网上,这里边有商业机会啊。”
“写个HTML会有什么商业机会?”
“静态的网站是和枯燥的,这些公司很快就会发现,可以和用户交互的、动态的网站才有商业价值。我准备专门提供这样的咨询服务,为他们开发各种动态的Web应用程序。对了,忘了自我介绍了,我叫Rasmus Lerdorf。”
这个人名怎么这么熟悉?
我想既然穿越而来,那就看看1994年的动态网站是怎么开发的吧。
我说:“我叫张大胖,主要用Java编程。”
“Java?那是什么语言?” 他两眼立刻放光了!
我意识到说漏嘴了,Java这时候还没诞生呢!
“其实叫C++--,一个小众语言。”
“和C语言相关,那就好,我们得用C语言写CGI脚本。”
我和他合伙开了个咨询公司,专门接开发动态网站的活儿。
但是开发一开始,我就崩溃了:没有前后端分离,没有Java,没有JSP,ASP, 真的全靠在C语言!
给大家看看:
void main(int argc, char *argv[]) { char *params, *data, *dest, *s, *tmp; char *name, *age; puts("Content-type: text/html\r\n"); puts("<HTML><HEAD><TITLE>Form Example</TITLE></HEAD>"); puts("<BODY><h1 id="My-nbsp-Example-nbsp-Form">My Example Form</h1>"); puts("<FORM action=\"form.cgi\" method=\"GET\">"); puts("Name: <INPUT type=\"text\" name=\"name\">"); puts("Age: <INPUT type=\"text\" name=\"age\">"); puts("<BR><INPUT type=\"submit\">"); puts("</FORM>"); data = getenv("QUERY_STRING"); if(data && *data) { params = data; dest = data; while(*data) { if(*data=='+') *dest=' '; else if(*data == '%' && ishex(*(data+1))&&ishex(*(data+2))) { *dest = (char) htoi(data + 1); data+=2; } else *dest = *data; data++; dest++; } *dest = '\0'; s = strtok(params,"&"); do { tmp = strchr(s,'='); if(tmp) { *tmp = '\0'; if(!strcmp(s,"name")) name = tmp+1; else if(!strcmp(s,"age")) age = tmp+1; } } while(s=strtok(NULL,"&")); printf("Hi %s, you are %s years old\n",name,age); } puts("</BODY></HTML>"); }
用一句话来说那就是:在C语言当中输出HTML代码。
这是人干的活吗?我都快写吐了!
Rasmus:“没办法啊,C语言编写CGI脚本,实现动态网页,可不就得这样嘛?对了,你会用Perl吗?”
“就是那个写出来以后代码谁都不认识的语言?我不想用!”
时间长了,Rasmus 也受不了了:“这些CGI 脚本无外乎就是处理表单, Post数据,过滤等,重复代码太多了,怎么样才能提高效率呢?”
他有空就琢磨这件事情,有一天,他想到了一招,把这些常用的功能都包装到一个C语言库中,它“植入”NCSA Web 服务器中(这是Apache之前最流行的服务器),然后在上面添加了一个模板系统,可以轻松地调用他们。
于是代码就是变成这个样子:
<html><head><title>Form Example</title></head> <body><h1 id="My-nbsp-Example-nbsp-Form">My Example Form</h1> <form action="form.phtml" method="POST"> Name: <input type="text" name="name"> Age: <input type="text" name="age"> <br><input type="submit"> </form> <?if($name):?> Hi <?echo $name?>, you are <?echo $age?> years old <?endif?> </body></html>
换句话说:就是在HTML中“混入”代码。
和CGI对比,这种方式对程序员来说非常友好,我们的工作效率一下子提高了很多。
说实话,我早就知道这种方式,就是ASP,JSP嘛,但是自己没那技术实力,实现不了啊!
Rasmus 很快就找到了一个新客户,用新工具为他们开发Web程序,连接到数据库,满足他们各种各样的需求。
随着客户的增多, 客户的需求也略有不同,于是,Rasmus 就不断地扩展它的工具箱, 从简单的解析器慢慢发展为包含条件标签,然后是循环标签、函数等各种复杂的东西,这已经是一门语言了。
Rasmus 把它们称为Personal Home Page,简称PHP
。
我这才意识到,原来遇到了<strong>PHP之父</strong>
!
很快就有其他程序员找上门来, 问我们:Rasmus, 你们怎么开发得这么快!
Rasmus说:我有个人工具箱啊!
“那我能不能用?”
Rasmus说:“可以啊,工具只是我的锤子,每个人都可以用我的锤子。”
我赶忙阻止他:“Rasmus, 你把锤子给别人, 那咱们靠什么赚钱?”
“我不靠锤子赚钱,我卖的是解决问题的服务。”
我心想他真是傻瓜,为什么不靠卖他的工具来赚钱呢?学学Bill Gates,过几年上市!
让我没想到的是,神奇的事情发生了。
使用PHP的人開始給Rasmus發送補丁了 ——他們發現了Rasmus都沒有發現的Bug!
於是Rasmus到客戶那裡說:我又升級了一個新版本,改了這個,改了那個。
客戶非常滿意,他們認為我們的工作效率非常高,不但能快速完成功能,還能快速修復Bug。
我突然意識到:這不就是開源嗎?
當然,這是1994、1995年,開源這個詞還沒出現,當時只有RMS提倡的自由軟體。
隨著越來越多的人提交補丁,PHP逐漸完善,1995年,Rasmus看到時機成熟,正式宣布了 PHP 1.0的誕生。
原來PHP就是這麼起步的啊!
Rasmus展示出了一個領袖的大度和風範,他放棄了對PHP的獨家控制權。
透過把專案的所有權分給其他人,這樣大家都可以投入,PHP成了大家的項目,而不是Rasmus一個人的項目。
當時,PHP源碼放在CVS中,我想讓Rasmus把PHP源碼放到GitHub,可是那時候連Git都沒有,哪而來的Hub?
在這裡沒有管理,大家是自我組織的小群體,可以圍繞自己感興趣的東西,自我組織。
任人唯賢, 程式碼說話。
這真正改變了PHP的本質。
有一個週末,我又和Rasmus來咖啡館喝咖啡,我說:「我覺得你得給PHP添加一些高級的特性了!」
「例如泛型,註解,面向函數編程,Lambda之類。」
「不不,我希望把進入PHP的門檻控制在很低的水平,無論是使用它還是向他做出貢獻。任何想解決Web問題的人通常會透過PHP找到非常直接的解決方案,許多聲稱可以解決Web 問題的替代方案太複雜了,想想看,你需要在周五之前完成工作,但是得翻閱800頁的手冊,這讓人崩潰。」
「你有沒有想過,將來PHP會統治Web?」
「哈哈, 有這種可能嗎?」
當年的Rasmus並不知道,PHP將在網路大潮中野蠻生長,和Linux, MySQL , Apache聯姻, 不斷攻城略地。
W3Tech的統計顯示,PHP統治了Web, 接近80%的網站在使用PHP!
「如果讓你總結一下,如何才能創建一個成功的開源項目,你會怎麼說?」
聊到這個話題,Rasmus突然就滔滔不絕起來,因為他從0到1發展起一個項目,簡直太有發言權了!
「如果你只有一個很酷的想法, 沒有人會加入你的項目,每個人都有很酷的想法。
如果你創造的東西是半生不熟的,那麼人們可能對你做的事情不屑一顧,他們會用自己的方式來解決問題。
只有你建構了足夠有用的東西,大家才會來到你的身邊,他們會更容易接受你的程式碼,然後稍微擴展來解決他們自己的問題,這樣雪球才能滾動起來。
所以,要開始一個開源項目,你必須解決一個困擾你一段時間的問題,這可能會花費數月的時間才能找到真正的問題並解決掉,然後你必須接受早期採用這的建議,盡最大努力讓工具對更廣泛的受眾有用。
最後可以考慮放棄控制權,讓其他人和你一起努力,當人們用你的程式碼做他們任何想做的事情的時候,你的開源專案就成功了!」
「太棒了,我希望我的讀者都能看到這段話。」
「你的讀者?」
「是的,碼農翻身頭條號,我不能說太多了,天機不可洩露,我得走了。」
說完,我就消失了。

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

PHP 8.4 帶來了多項新功能、安全性改進和效能改進,同時棄用和刪除了大量功能。 本指南介紹如何在 Ubuntu、Debian 或其衍生版本上安裝 PHP 8.4 或升級到 PHP 8.4

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7