<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    使用Graphviz時(shí)候遇到這樣一個(gè)問(wèn)題
    IOError: Renderer type: "gif" not recognized. Use one of: canon cmap cmapx dia dot fig hpgl imap ismap mif mp pcl pic plain plain-ext ps ps2 svg svgz vtx xdot
    表現(xiàn)在無(wú)法生成gif或者png圖像
    應(yīng)該是官方一個(gè)bug
    解決方案:
    安裝 graphviz-gd
    yum search graphviz-gd
    ========================= Matched: graphviz-gd =========================
    graphviz-gd.x86_64 : Graphviz plugin for renderers based on gd
    好了,裝上這個(gè)東西就ok了
    posted @ 2014-02-13 13:25 小馬歌 閱讀(2883) | 評(píng)論 (0)編輯 收藏
     

    一些運(yùn)行在Nginx上的網(wǎng)站有時(shí)候會(huì)出現(xiàn)“502 Bad Gateway”錯(cuò)誤,有些時(shí)候甚至頻繁的出現(xiàn)。以下是小編搜集整理的一些Nginx 502錯(cuò)誤的排查方法,供參考:

      Nginx 502錯(cuò)誤的原因比較多,是因?yàn)樵诖砟J较潞蠖朔?wù)器出現(xiàn)問(wèn)題引起的。這些錯(cuò)誤一般都不是nginx本身的問(wèn)題,一定要從后端找原因!但nginx把這些出錯(cuò)都攬?jiān)谧约荷砩狭?,著?shí)讓nginx的推廣者備受置疑,畢竟從字眼上理解,bad gateway?不就是bad nginx嗎?讓不了解的人看到,會(huì)直接把責(zé)任推在nginx身上,希望nginx下一個(gè)版本會(huì)把出錯(cuò)提示寫(xiě)稍微友好一些,至少不會(huì)是現(xiàn)在簡(jiǎn)單的一句 502 Bad Gateway,另外還不忘附上自己的大名。

    Nginx 502的觸發(fā)條件

      502錯(cuò)誤最通常的出現(xiàn)情況就是后端主機(jī)當(dāng)機(jī)。在upstream配置里有這么一項(xiàng)配置:proxy_next_upstream,這個(gè)配置指定了 nginx在從一個(gè)后端主機(jī)取數(shù)據(jù)遇到何種錯(cuò)誤時(shí)會(huì)轉(zhuǎn)到下一個(gè)后端主機(jī),里頭寫(xiě)上的就是會(huì)出現(xiàn)502的所有情況拉,默認(rèn)是error timeout。error就是當(dāng)機(jī)、斷線之類(lèi)的,timeout就是讀取堵塞超時(shí),比較容易理解。我一般是全寫(xiě)上的:

    proxy_next_upstream error timeout invalid_header http_500 http_503;

      不過(guò)現(xiàn)在可能我要去掉http_500這一項(xiàng)了,http_500指定后端返回500錯(cuò)誤時(shí)會(huì)轉(zhuǎn)一個(gè)主機(jī),后端的jsp出錯(cuò)的話(huà),本來(lái)會(huì)打印一堆 stacktrace的錯(cuò)誤信息,現(xiàn)在被502取代了。但公司的程序員可不這么認(rèn)為,他們認(rèn)定是nginx出現(xiàn)了錯(cuò)誤,我實(shí)在沒(méi)空跟他們解釋502的原理 了……

    503錯(cuò)誤就可以保留,因?yàn)楹蠖送ǔJ莂pache resin,如果apache死機(jī)就是error,但resin死機(jī),僅僅是503,所以還是有必要保留的。

    解決辦法

    遇到502問(wèn)題,可以?xún)?yōu)先考慮按照以下兩個(gè)步驟去解決。

    1、查看當(dāng)前的PHP FastCGI進(jìn)程數(shù)是否夠用:

    netstat -anpo | grep "php-cgi" | wc -l

    如果實(shí)際使用的“FastCGI進(jìn)程數(shù)”接近預(yù)設(shè)的“FastCGI進(jìn)程數(shù)”,那么,說(shuō)明“FastCGI進(jìn)程數(shù)”不夠用,需要增大。

    2、部分PHP程序的執(zhí)行時(shí)間超過(guò)了Nginx的等待時(shí)間,可以適當(dāng)增加nginx.conf配置文件中FastCGI的timeout時(shí)間,例如:

    http  {
    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    ......
    }
    ......

      php.ini中memory_limit設(shè)低了會(huì)出錯(cuò),修改了php.ini的memory_limit為64M,重啟nginx,發(fā)現(xiàn)好了,原來(lái)是PHP的內(nèi)存不足了。

      如果這樣修改了還解決不了問(wèn)題,可以參考下面這些方案:

    一、max-children和max-requests

      一臺(tái)服務(wù)器上運(yùn)行著nginx php(fpm) xcache,訪問(wèn)量日均 300W pv左右。

      最近經(jīng)常會(huì)出現(xiàn)這樣的情況:php頁(yè)面打開(kāi)很慢,cpu使用率突然降至很低,系統(tǒng)負(fù)載突然升至很高,查看網(wǎng)卡的流量,也會(huì)發(fā)現(xiàn)突然降到了很低。這種情況只持續(xù)數(shù)秒鐘就恢復(fù)了。

      檢查php-fpm的日志文件發(fā)現(xiàn)了一些線索。

    Sep 30 08:32:23.289973 [NOTICE] fpm_unix_init_main(), line 271: getrlimit(nofile): max:51200, cur:51200  Sep 30 08:32:23.290212 [NOTICE] fpm_sockets_init_main(), line 371: using inherited socket fd=10, “127.0.0.1:9000″  Sep 30 08:32:23.290342 [NOTICE] fpm_event_init_main(), line 109: libevent: using epoll  Sep 30 08:32:23.296426 [NOTICE] fpm_init(), line 47: fpm is running, pid 30587

      在這幾句的前面,是1000多行的關(guān)閉children和開(kāi)啟children的日志。

      原來(lái),php-fpm有一個(gè)參數(shù) max_requests,該參數(shù)指明了,每個(gè)children最多處理多少個(gè)請(qǐng)求后便會(huì)被關(guān)閉,默認(rèn)的設(shè)置是500。因?yàn)閜hp是把請(qǐng)求輪詢(xún)給每個(gè) children,在大流量下,每個(gè)childre到達(dá)max_requests所用的時(shí)間都差不多,這樣就造成所有的children基本上在同一時(shí)間 被關(guān)閉。

      在這期間,nginx無(wú)法將php文件轉(zhuǎn)交給php-fpm處理,所以cpu會(huì)降至很低(不用處理php,更不用執(zhí)行sql),而負(fù)載會(huì)升至很高(關(guān)閉和開(kāi)啟children、nginx等待php-fpm),網(wǎng)卡流量也降至很低(nginx無(wú)法生成數(shù)據(jù)傳輸給客戶(hù)端)

      解決問(wèn)題很簡(jiǎn)單,增加children的數(shù)量,并且將 max_requests 設(shè)置未 0 或者一個(gè)比較大的值:

      打開(kāi) /usr/local/php/etc/php-fpm.conf調(diào)大以下兩個(gè)參數(shù)(根據(jù)服務(wù)器實(shí)際情況,過(guò)大也不行)

    <value name="max_children">5120</value>  <value name="max_requests">600</value>

      然后重啟php-fpm。

    二、增加緩沖區(qū)容量大小

      將nginx的error log打開(kāi),發(fā)現(xiàn)“pstream sent too big header while reading response header from upstream”這樣的錯(cuò)誤提示。查閱了一下資料,大意是nginx緩沖區(qū)有一個(gè)bug造成的,我們網(wǎng)站的頁(yè)面消耗占用緩沖區(qū)可能過(guò)大。參考老外寫(xiě)的修 改辦法增加了緩沖區(qū)容量大小設(shè)置,502問(wèn)題徹底解決。后來(lái)系統(tǒng)管理員又對(duì)參數(shù)做了調(diào)整只保留了2個(gè)設(shè)置參數(shù):client head buffer,fastcgi buffer size。

    三、request_terminate_timeout

      如果主要是在一些post或者數(shù)據(jù)庫(kù)操作的時(shí)候出現(xiàn)502這種情況,而不是在靜態(tài)頁(yè)面操作中常見(jiàn),那么可以查看一下php-fpm.conf設(shè)置中的一項(xiàng):

    request_terminate_timeout

    這個(gè)值是max_execution_time,就是fast-cgi的執(zhí)行腳本時(shí)間。

    0s

    0s為關(guān)閉,就是無(wú)限執(zhí)行下去。(當(dāng)時(shí)裝的時(shí)候沒(méi)仔細(xì)看就改了一個(gè)數(shù)字)問(wèn)題解決了,執(zhí)行很長(zhǎng)時(shí)間也不會(huì)出錯(cuò)了。優(yōu)化fastcgi中,還可以改改這個(gè)值5s 看看效果。

    php-cgi進(jìn)程數(shù)不夠用、php執(zhí)行時(shí)間長(zhǎng)、或者是php-cgi進(jìn)程死掉,都會(huì)出現(xiàn)502錯(cuò)誤。

    posted @ 2014-02-12 18:48 小馬歌 閱讀(1112) | 評(píng)論 (0)編輯 收藏
     
    感謝Rockux的投遞
    看完之后,終于明白為什么優(yōu)秀的工程師都去了/想去facebook,因?yàn)槟抢锸枪こ處焸兊奶焯谩?/span>我對(duì)facebook的運(yùn)轉(zhuǎn)著迷。這是一個(gè)很獨(dú)特的環(huán)境,不容易被復(fù)制(他們的體系并不適合所有的公司,即使他們努力嘗試過(guò))。下面是我和facebook的朋友們關(guān)于他們?nèi)绾伍_(kāi)發(fā)和管理項(xiàng)目的記錄。
    現(xiàn)在距離我收集的這些信息又過(guò)去6個(gè)月了,我相信facebook肯定又對(duì)他們的項(xiàng)目開(kāi)發(fā)實(shí)踐進(jìn)行了改進(jìn)。所以這些記錄可能會(huì)有點(diǎn)過(guò)時(shí)。同時(shí)facebook的工程師驅(qū)動(dòng)文化也越來(lái)越為大眾所知。非常感謝那些幫助我整理這篇文章的facebook的朋友們。

    記錄:

    • 截止到2010年6月,facebook有將近2000名員工,10個(gè)月前只有1100名,一年之間差不多翻了一番。
    • 兩個(gè)最大的部門(mén)是工程師和運(yùn)維,每個(gè)部門(mén)大概都是400-500人。這兩個(gè)部門(mén)人數(shù)大約占了公司的一半。
    • 產(chǎn)品經(jīng)理與工程師的比例大約為1-7到1-10。
    • 每個(gè)工程師入職時(shí),都要接收4-6周的培訓(xùn),通過(guò)修補(bǔ)bugs和聽(tīng)高級(jí)開(kāi)發(fā)工程師的課程來(lái)熟悉facebook。
    • 培訓(xùn)結(jié)束后,每個(gè)工程師都可以接觸線上的數(shù)據(jù)庫(kù)(更大的權(quán)力意味著更大的責(zé)任,也有一份"勿做清單",不然可能會(huì)被開(kāi),比如共享用戶(hù)的隱私數(shù)據(jù))。
    • 有非常牢靠的安全體系,以免有人不小心/故意做了些不好的事。
    • 每個(gè)工程師可以修改facebook的任何代碼,隨時(shí)可以遷入。
    • 濃厚的工程師驅(qū)動(dòng)文化。"產(chǎn)品經(jīng)理基本可以被忽略",這是facebook一名員工的話(huà)。工程師可以修改流程的細(xì)節(jié),重新安排工作任務(wù),隨時(shí)植入自己的想法。
    • 在每月的跨部門(mén)會(huì)議上,由工程師來(lái)匯報(bào)工作進(jìn)度,市場(chǎng)部和產(chǎn)品經(jīng)理會(huì)出席會(huì)議,也可以做些簡(jiǎn)短的發(fā)言,但如果說(shuō)得太多,很可能就會(huì)被打小報(bào)告。他們確實(shí)想讓工程師來(lái)主導(dǎo)產(chǎn)品的開(kāi)發(fā),對(duì)自己的產(chǎn)品負(fù)責(zé)。
    • 項(xiàng)目需要的資源都是自愿的
    • 一個(gè)產(chǎn)品經(jīng)理把工程師們召集到一起,讓他們對(duì)他的想法產(chǎn)生興趣。
    • 工程師們決定開(kāi)發(fā)那些讓他們感興趣的特性。
    • 工程師跟他們的經(jīng)理說(shuō):"我下周想開(kāi)發(fā)這5個(gè)新特性"。
    • 經(jīng)理會(huì)讓工程師獨(dú)立開(kāi)發(fā),可能有時(shí)會(huì)讓他優(yōu)先完成一些特性。
    • 工程師獨(dú)立完成所有的特性——前端/后端/數(shù)據(jù)庫(kù),等等所有相關(guān)的部分。如果需要得到設(shè)計(jì)人員的幫助,需要先讓設(shè)計(jì)人員對(duì)你的想法產(chǎn)生興趣。其他如架構(gòu)之類(lèi)的也一樣。但總體來(lái)說(shuō),工程師要獨(dú)立完成所有的任務(wù)。
    • 對(duì)于某個(gè)特性是否值得開(kāi)發(fā)的爭(zhēng)論,通常是這么解決的:花一個(gè)星期的時(shí)間完成他,并在小部分人群中(如1%)進(jìn)行測(cè)試。
    • 工程師常常希望解決難題,這能獲得聲望和尊敬。他們很難對(duì)前端項(xiàng)目或UI設(shè)計(jì)產(chǎn)生太大的興趣。這跟其他公司可能正好相反。在facebook,后端任務(wù),比如新的feed算法,廣告投放算法,memcache優(yōu)化等等,是工程師真正感興趣的。
    • 所有的代碼修改都要進(jìn)行審核(通過(guò)一個(gè)或多個(gè)工程師),但News Feed是個(gè)例外,因?yàn)樘匾?,Zuckerberg會(huì)親自review。
    • 所有的修改至少要被一個(gè)人審核,而且這個(gè)系統(tǒng)可以讓任何人很方便地審核其他人的代碼,即使你沒(méi)有邀請(qǐng)他
    • 工程師負(fù)責(zé)測(cè)試,代碼修復(fù),和維護(hù)自己的項(xiàng)目。
    • 每個(gè)辦公室或通過(guò)VPN連接的員工會(huì)使用下一版的facebook,這個(gè)版本的facebook會(huì)經(jīng)常更新,通常比公開(kāi)的早1-12小時(shí)。所有的員工被強(qiáng)烈建議提交bugs,而且通常會(huì)很快被修復(fù)。
    • 很奇怪只有很少的QA或自動(dòng)測(cè)試——"大部分工程師都能寫(xiě)出基本沒(méi)有bug的代碼,只是在其他公司他們不需要這么做。如果有QA部門(mén),他們只要把代碼寫(xiě)完,扔給他們就行了"
    • [針對(duì)上一條]我們有自動(dòng)測(cè)試,代碼發(fā)布前必須要通過(guò)測(cè)試。我們不相信"所有的工程師都能寫(xiě)出沒(méi)有bug的代碼",畢竟這是一個(gè)商業(yè)公司。
    • 很奇怪,缺少產(chǎn)品經(jīng)理的影響和控制——產(chǎn)品經(jīng)理是很獨(dú)立的和自由的。產(chǎn)生影響力的關(guān)鍵是與工程師和工程師的領(lǐng)導(dǎo)們們搞好關(guān)系。需要大致了解技術(shù),不要提一些愚蠢的想法。
    • 所有提交的代碼每周二打包一次。
    • 只要多一分努力,終于一天會(huì)發(fā)生改變。
    • 星期二的代碼發(fā)布,需要所有的提交過(guò)代碼的工程師在場(chǎng)。
    • 代碼打包前,工程師必須在一個(gè)特殊的IRC channel上。
    • 運(yùn)維執(zhí)行打包過(guò)程
    • facebook有大約60000臺(tái)服務(wù)器
    • 有9個(gè)代碼發(fā)布級(jí)別
    • 最小的級(jí)別只有6臺(tái)服務(wù)器
    • 星期二的代碼發(fā)布會(huì)先發(fā)布到6臺(tái)服務(wù)器上,運(yùn)維組會(huì)檢測(cè)這6臺(tái)服務(wù)器的反應(yīng),保證代碼正常工作,然后再提交到下一級(jí)
    • 如果發(fā)布出現(xiàn)了一些問(wèn)題(如報(bào)錯(cuò)等等),那么就停止下一級(jí)的部署,提交出錯(cuò)代碼的工程師負(fù)責(zé)修復(fù)問(wèn)題,然后從頭繼續(xù)發(fā)布。
    • 所以一次發(fā)布可能會(huì)經(jīng)歷幾次重復(fù):1-2-3-fix. 回到1. 1-2-3-4-5-fix. 回到1. 1-2-3-4-5-6-7-8-9
    • 運(yùn)維組是受過(guò)嚴(yán)格訓(xùn)練,倍受尊敬,而且有商業(yè)意識(shí)的。他們的工作包括分析錯(cuò)誤日志,負(fù)載和內(nèi)存狀態(tài)等等。還包括用戶(hù)行為。
    • 代碼發(fā)布期間,運(yùn)維組使用IRC-based頁(yè)面系統(tǒng),可以通過(guò)facebook/email/irc/im/sms ping每一個(gè)工程師,如果需要他們注意的話(huà)。對(duì)運(yùn)維組不做回應(yīng)是一件很羞愧的事。
    • 代碼一旦發(fā)布到第9級(jí),并且穩(wěn)定運(yùn)行,就算發(fā)布成功了。
    • 如果一個(gè)特性沒(méi)有按時(shí)完成,也沒(méi)什么大不了的,下次完成時(shí)一并發(fā)布即可。
    • 如果被svn-blamed,public shamed或工作經(jīng)常疏忽就很可能被開(kāi)除。"這是一個(gè)高效的文化"。不夠高效或者不夠聰明的員工會(huì)被剔除。管理層會(huì)在6個(gè)月的時(shí)間里觀察你表現(xiàn),如果不合格,只能說(shuō)再見(jiàn)。每一級(jí)都是這個(gè)待遇,即使是C級(jí)別和VP級(jí)別,如果不夠高效,也會(huì)被開(kāi)除。
    • 被責(zé)罵不會(huì)導(dǎo)致解雇。我們特別尊重別人,原諒別人。大部分高級(jí)工程師都或多或少犯過(guò)一些嚴(yán)重的錯(cuò)誤,包括我。但沒(méi)有人因此被解雇。
    • 我也沒(méi)有遇到過(guò)因?yàn)樯厦嫣岬竭^(guò)的犯錯(cuò)誤而被解雇。有些人犯了錯(cuò),他們會(huì)非常努力地去修復(fù),也讓其他人得到了學(xué)習(xí)。
    posted @ 2014-01-23 15:21 小馬歌 閱讀(358) | 評(píng)論 (0)編輯 收藏
     
    PHPUnit
    是一個(gè)輕量級(jí)的PHP測(cè)試框架。它是在PHP5下面對(duì)JUnit3系列版本的完整移植,是xUnit測(cè)試框架家族的一員(它們都基于模式先鋒Kent Beck的設(shè)計(jì))

    單元測(cè)試是幾個(gè)現(xiàn)代敏捷開(kāi)發(fā)方法的基礎(chǔ),使得PHPUnit成為許多大型PHP項(xiàng)目的關(guān)鍵工具。這個(gè)工具也可以被Xdebug擴(kuò)展用來(lái)生成代碼覆蓋率報(bào)告 ,并且可以與phing集成來(lái)自動(dòng)測(cè)試,最合它還可以和Selenium整合來(lái)完成大型的自動(dòng)化集成測(cè)試。
    資料:http://phpunit.de/documentation.html

    2 composer
    項(xiàng)目依賴(lài)管理工具 資料:http://getcomposer.org/doc/00-intro.md#installation-nix

    3
     syslog-ng  
    集中日志服務(wù)器,相比syslog更有優(yōu)勢(shì) 資料:http://www.gaizaoren.org/archives/428

    posted @ 2014-01-23 11:24 小馬歌 閱讀(292) | 評(píng)論 (0)編輯 收藏
     

    轉(zhuǎn)自:http://my.oschina.net/u/200745/blog/36662

    1.引用文件方式

    對(duì)include()來(lái)說(shuō),在include()執(zhí)行時(shí)文件每次都要進(jìn)行讀取和評(píng)估;而對(duì)于require()來(lái)說(shuō),文件只處理一次(實(shí)際上,文件內(nèi)容替換了require()語(yǔ)句)。這就意味著如果有包含這些指令之一的代碼和可能執(zhí)行多次的代碼,則使用require()效率比較高。另一方面,如果每次執(zhí)行代碼時(shí)相讀取不同的文件,或者有通過(guò)一組文件疊代的循環(huán),就使用include(),因?yàn)榭梢越o想要包括的文件名設(shè)置一個(gè)變量,當(dāng)參數(shù)為include()時(shí)使用這個(gè)變量。

     2.是否有條件引用

    在PHP變成中,include()與require()的功能相同,但在用法上卻有一些不同,include()是有條件包含函數(shù),而require()則是無(wú)條件包含函數(shù)。例如在下面的一個(gè)例子中,如果變量$somgthing為真,則將包含文件somefile:
    if($something){
    include("somefile");
    }
    但不管$something取何值,下面的代碼將把文件somefile包含進(jìn)文件里:
    if($something){
    require("somefile");
    }
    下面的這個(gè)有趣的例子充分說(shuō)明了這兩個(gè)函數(shù)之間的不同。
    $i = 1;
    while ($i < 3) {
    require("somefile.$i");
    $i++;
    }
    在這段代碼中,每一次循環(huán)的時(shí)候,程序都將把同一個(gè)文件包含進(jìn)去。很顯然這不是程序員的初衷,從代碼中我們可以看出這段代碼希望在每次循環(huán)時(shí),將不同的文件包含進(jìn)來(lái)。如果要完成這個(gè)功能,必須求助函數(shù)include():
    $i = 1;
    while ($i < 3) {
    include("somefile.$i");
    $i++;
    }

     

    3.報(bào)錯(cuò)

     

    用例子來(lái)說(shuō)話(huà),寫(xiě)兩個(gè)php文件,名字為test1.php  和test2.php,注意相同的目錄中,不要存在一個(gè)名字是test999.php的文件。
    test.php
    <?PHP
    include  (”test999.php”);
    echo  “abc”;
    ?>

    test2.php
    <?PHP
    require (”test999.php”)
    echo  “abc”;
    ?>

    瀏覽第一個(gè)文件,因?yàn)闆](méi)有找到test999.php文件,我們看到了報(bào)錯(cuò)信息,同時(shí),報(bào)錯(cuò)信息的下邊顯示了abc,你看到的可能是類(lèi)似下邊的情況:
    Warning: include(test1aaa.php) [function.include]: failed to open stream: No such file or directory in D:\WebSite\test.php on line 2

    Warning: include() [function.include]: Failed opening ‘test1aaa.php’ for inclusion (include_path=’.;C:\php5\pear’) in D:\WebSite\test.php on line 2
    abc

    瀏覽第二個(gè)文件,因?yàn)闆](méi)有找到test999.php文件,我們看到了報(bào)錯(cuò)信息,但是,報(bào)錯(cuò)信息的下邊沒(méi)有顯示abc,你看到的可能是類(lèi)似下邊的情況:
    Warning: require(test1aaa.php) [function.require]: failed to open stream: No such file or directory in D:\WebSite\test.php on line 2

    Fatal error: require() [function.require]: Failed opening required ‘test1aaa.php’ (include_path=’.;C:\php5\pear’) in D:\WebSite\test.php on line 2

    現(xiàn)在就能很清楚的知道include和require的區(qū)別:include引入文件的時(shí)候,如果碰到錯(cuò)誤,會(huì)給出提示,并繼續(xù)運(yùn)行下邊的代碼,require引入文件的時(shí)候,如果碰到錯(cuò)誤,會(huì)給出提示,并停止運(yùn)行下邊的代碼。

    posted @ 2013-12-25 20:53 小馬歌 閱讀(257) | 評(píng)論 (0)編輯 收藏
     
         摘要: from:http://www.searchtb.com/2012/06/rolling-curl-best-practices.html在實(shí)際項(xiàng)目或者自己編寫(xiě)小工具(比如新聞聚合,商品價(jià)格監(jiān)控,比價(jià))的過(guò)程中, 通常需要從第3方網(wǎng)站或者API接口獲取數(shù)據(jù), 在需要處理1個(gè)URL隊(duì)列時(shí), 為了提高性能, 可以采用cURL提供的curl_multi_*族函數(shù)實(shí)現(xiàn)簡(jiǎn)單的并發(fā).本文將探討兩種具體的實(shí)現(xiàn)方...  閱讀全文
    posted @ 2013-12-13 14:15 小馬歌 閱讀(467) | 評(píng)論 (0)編輯 收藏
     
    摘要:Polymer是由原Palm webOS開(kāi)發(fā)Enyo框架的團(tuán)隊(duì)加盟Google后打造的,基于Shadow DOM、Custom Elements、MDV等最新瀏覽器特性,支持Web Components。

    今年的Google I/O大會(huì),絕對(duì)是一場(chǎng)為開(kāi)發(fā)者所準(zhǔn)備的盛會(huì),發(fā)布多個(gè)軟件產(chǎn)品與服務(wù),并且主要以發(fā)布平臺(tái)和服務(wù)為主,比如讓Android開(kāi)發(fā)者稱(chēng)贊的Android Studio、推出Google Play Game服務(wù)、對(duì)地圖進(jìn)行重大升級(jí)等。而在Web平臺(tái)領(lǐng)域,Google則發(fā)布了最新的Web UI庫(kù)Polymer。

    Polymer基于Shadow DOM、Custom Elements、MDV等最新瀏覽器特性,代表了下一代Web框架的方向:一切皆組件、盡量減少代碼量、盡量減少框架限制。由加盟Google的原Palm webOS開(kāi)發(fā)團(tuán)隊(duì)打造。

     

    架構(gòu)圖

    快速入門(mén)

    1.把項(xiàng)目拷貝到解決方案的根目錄文件夾中,參考 Get the code

    1
    git clone git://github.com/Polymer/polymer.git --recursive
    2.啟動(dòng)Web服務(wù)器

    3.在主頁(yè)面引用polymer.js

    1
    <script src="Polymer/polymer.js"></script>
    4.閱讀開(kāi)始指南

    5.學(xué)習(xí)如何使用Polymer內(nèi)核快速搭建Web組件

    6.玩轉(zhuǎn)toolkit-ui示例(必須在Web服務(wù)器上運(yùn)行)

    7.加入mailing list,提問(wèn)并且得到相應(yīng)地回復(fù)。

    Polymer內(nèi)核

    Polymer內(nèi)核代碼由polymer.js這個(gè)文件提供,其提供了一個(gè)薄層代碼來(lái)表示Polymer選項(xiàng),并且提供了所有組件使用的糖。

    1. 組件聲明
    2. Web組件聲明代碼如下所示:

      1
      2
      3
      4
      5
      6
      7
      8
      <element name="tag-name">
      <template>
      <!-- shadow DOM here -->
      </template>
      <script>
      // lifecycle setup here
      </script>
      </element>

      在該組件中添加Polymer.register生命周期來(lái)初始化組件的<script>塊,如下所示:

      1
      2
      3
      4
      5
      6
      7
      8
      <font face="Menlo, Monaco, monospace, sans-serif"><element name="tag-name">
        <template>
          <!-- shadow DOM here -->
        </template>
        <script>
          Polymer.register(this);
        </script>
      </element></font>

    3. 元素初始化
    4. 第一個(gè)參數(shù)Polymer.register是引用到<element>元素里的,因?yàn)槟_本在element標(biāo)記里運(yùn)行,所以參數(shù)就設(shè)為“this”。

      你可以提供第二個(gè)對(duì)象參數(shù)到Polymer.register里去定義對(duì)象原型,在下面的代碼里,該組件初始化了一個(gè)message屬性和ready方法。

      1
      2
      3
      4
      5
      6
      Polymer.register(this, {
      message: "Hello!",
      ready: function() {
      // component is ready now, we can do stuff
      }
      });

    目前,Polymer還處于初期階段,它和其他框架一樣,盡可能地?fù)肀TML。它的目標(biāo)是通過(guò)使用像Custom Elements和Shadow DOM這些新興的Web標(biāo)準(zhǔn)的少量獨(dú)立polyfill發(fā)展Web平臺(tái)。此外,應(yīng)用于移動(dòng)平臺(tái)也是其中的核心目標(biāo)之一。Polymer開(kāi)發(fā)團(tuán)隊(duì)正在研究響應(yīng)式組件,讓其可以正確無(wú)誤地在臺(tái)式機(jī)、平板電腦、手機(jī)上進(jìn)行自動(dòng)化配置。

    當(dāng)然,Polymer的誕生也意味著Google現(xiàn)在有三個(gè)相互競(jìng)爭(zhēng)的Web應(yīng)用開(kāi)發(fā)庫(kù):Polymer、Dart(也具有UI開(kāi)發(fā)功能)和AngularJS。

    對(duì)于Polymer,開(kāi)發(fā)者有哪些話(huà)要說(shuō)呢?讓我們一起來(lái)看下:

    清風(fēng)一二兩:Palm webOS用另一種方式重生?

    三合一趙:Enyo的Google版~換湯不換藥~

    劉晗的微博:在HTML領(lǐng)域離標(biāo)準(zhǔn)太遠(yuǎn)自己搞一套,出路不大。特別是像這種綁定機(jī)制,貌似理念是MVC,但MVC這種東西做簡(jiǎn)單頁(yè)面還行。

    eldude:聲明性質(zhì)、封裝、數(shù)據(jù)綁定、屬性和事件驅(qū)動(dòng)API這些都是數(shù)量級(jí)的,要比現(xiàn)有JavaScript/HTML UI組件簡(jiǎn)單。

    neilk:這個(gè)框架看起來(lái)非???,但“built by Google”有點(diǎn)用詞不當(dāng),像Closure或Angular、Polymer等這些都Google內(nèi)部使用的技術(shù),在經(jīng)過(guò)千錘百煉后才像面向公眾,因此稱(chēng)作 "technologies by Googlers"更為合適。

    相關(guān)資料

    Polymer主頁(yè): http://www.polymer-project.org/

    項(xiàng)目主頁(yè)上的FAQ描述比較清晰: http://www.polymer-project.org/faq.html 

    架構(gòu)圖: http://www.polymer-project.org/images/architecture-diagram.svg?20130516

    GitHub: https://github.com/polymer/polymer 

    本文為CSDN編譯整理,未經(jīng)允許不得轉(zhuǎn)載,如需轉(zhuǎn)載請(qǐng)聯(lián)系market#csdn.net(#換成@)

    posted @ 2013-12-04 15:20 小馬歌 閱讀(435) | 評(píng)論 (0)編輯 收藏
     

    互聯(lián)網(wǎng)公司linux運(yùn)維生產(chǎn)場(chǎng)景常用軟件工具一覽,同時(shí)補(bǔ)充了個(gè)別常用但不是開(kāi)源的軟件。

    下午受邀請(qǐng)參加了一個(gè)BBS活動(dòng),于是有了下面的內(nèi)容。
    下面是在linux網(wǎng)站運(yùn)維方向老男孩最近幾年常用的免費(fèi)的開(kāi)源軟件,臨時(shí)即興想起來(lái)的,在這里和大家分享,希望給初學(xué)者指引一點(diǎn)路。
    linux的世界真的很精彩,還沒(méi)入門(mén)的朋友趕緊進(jìn)來(lái)吧!

    操作系統(tǒng):Centos※,Freebsd,Ubuntu,Redhatlinux,suselinux
    網(wǎng)站服務(wù):apache※,nginx,lighttpd,php※,tomcat※,resin
    數(shù)據(jù)庫(kù):Mysql※,PostgreSQL,Mysql-proxy,MariaDB
    代理相關(guān):lvs,keepalived,haproxy,nginx,apache,heartbeat(此行都是※)
    網(wǎng)站緩存:squid※,nginx※,varnish
    內(nèi)存緩存:memcached※,memcachedb,TokyoTyrant※,MongoDB,Cassandra※,redis※,tair,CouchDB
    存儲(chǔ)相關(guān):Nfs※,Moosefs※,Hadoop※,gfs※,lustre,FastDFS
    版本管理:cvs,svn※,git
    監(jiān)控報(bào)警:mboy,mrtg,nagios,cacti,zabbix,munin,hyperic
    域名解析:bind,powerdns,dnsmq
    同步軟件:rsync,inotify,sersync,drbd,csync2,union,lsyncd,scp(此行都是※)
    分發(fā)工具:Secboy,expect※,puppet※,cfengine※,ssh+rsync+sersync
    虛擬軟件:xen,kvm
    內(nèi)網(wǎng)軟件:iptables,zebra,iftraf,ntop,tc,iftop
    郵件軟件:qmail※,posfix※,sendmail
    遠(yuǎn)程撥號(hào):openvpn,pptp,openswan,ipip
    統(tǒng)一認(rèn)證:ldap(可結(jié)合微軟活動(dòng)目錄)
    隊(duì)列工具:ActiveMQ※,RabbitMQ,MemcacheQ
    打包發(fā)布:mvn,ants,jenkins
    測(cè)試軟件:apacheab,smokeping,siege,JMeter,Webbench,LoadRunner(此行都是
    日志相關(guān):syslog,rsyslog,Awstats
    DB代理:mysql-proxy,amoeba(更多還是程序?qū)崿F(xiàn)讀寫(xiě)分離)
    搜索軟件:Sphinx,Xapian(大公司會(huì)自己開(kāi)發(fā)類(lèi)似百度的小規(guī)模內(nèi)部搜索引擎)

    提示:
    1)以上所有軟件都是老男孩用過(guò)或測(cè)試過(guò)的。
    2)帶的為老男孩最近幾年用的比較多,可信任使用的。也是近年來(lái)linux運(yùn)維的大眾。
    3)有了功能分類(lèi)和軟件名,大家有需求,可以按功能找軟件直接G就知道了。

    4)學(xué)習(xí)要有舍有得,什么都抓必然短時(shí)間都不會(huì)精,希望大家能抓重點(diǎn),抓精髓,大眾軟件(帶)先熟練了,這是基礎(chǔ)加提高,在研究小眾軟件(不帶),這是高手之路,最后在研究偏門(mén)的,世外高手之路,當(dāng)然前提是先掌握前面的大眾和小眾。
    5)當(dāng)然還有一些沒(méi)有大眾開(kāi)源的有一些也很棒,如審計(jì)堡壘機(jī)程序。

    還有用的多的,老男孩落下的,大家補(bǔ)充啊。

    本文出自 “老男孩linux運(yùn)維” 博客,請(qǐng)務(wù)必保留此出處http://oldboy.blog.51cto.com/2561410/775056

    posted @ 2013-11-07 16:12 小馬歌 閱讀(425) | 評(píng)論 (0)編輯 收藏
     

    Memcached資源很容易混淆,所以我打包好了.
    下載地址: http://www.euphie.net/downloads/memcached.tar.gz
    下載后解壓,里面有幾個(gè)包:
    1.memcached-1.4.15 //Memcached服務(wù)端.
    2.memcached-2.1.0 //PHP的Memcached擴(kuò)展,其實(shí)Memcached擴(kuò)展有兩種,還有一種叫Memcache,不過(guò)Memcached比Memcache功能更強(qiáng)大.
    3.libevent-2.0.21-stable //Memcached服務(wù)端的依賴(lài)包.
    4.libmemcached-1.0.16 //Memcached擴(kuò)展的依賴(lài)包.

    一,安裝Libevent

    #cd libevent-2.0.21-stable #./configure -prefix=/usr/local/libevent #make #make install

    二,安裝Memcached服務(wù)端

    #cd memcached-1.4.15 #./configure -prefix=/usr/local/memcached  -with-libevent=/usr/local/libevent #make #make install

    三,啟動(dòng)Memcached服務(wù)

    #/usr/local/memcached/bin/memcached -d -m 50  -u root -p 12000 -c 256 -P /tmp/memcached.pid

    注:
    -d選項(xiàng)是啟動(dòng)一個(gè)守護(hù)進(jìn)程,
    -m是分配給Memcache使用的內(nèi)存數(shù)量,單位是MB.
    -u是運(yùn)行Memcache的用戶(hù).
    -l是監(jiān)聽(tīng)的服務(wù)器IP地址,我這里沒(méi)有填.
    -p是設(shè)置Memcache監(jiān)聽(tīng)的端口.
    -c選項(xiàng)是最大運(yùn)行的并發(fā)連接數(shù),默認(rèn)是1024,按照你服務(wù)器的負(fù)載量來(lái)設(shè)定.
    -P是設(shè)置保存Memcache的pid文件.

    四,安裝Libmemcached

    #cd libmemcached-1.0.16 #./configure -prefix=/usr/local/libmemcached  -with-memcached=/usr/local/memcached/bin/memcached #make #make install

    注:
    如果報(bào)”./libmemcached-1.0/memcached.h:46:27: error: tr1/cinttypes: No such file or directory”錯(cuò)誤,則需要升級(jí)gcc版本.

    五,安裝Memcached PHP擴(kuò)展

    #cd memcached-2.1.0 找到phpize和php-config的路徑,我的分別是/usr/local/bin/phpize和/usr/bin/php-config. #/usr/local/bin/phpize #./configure --with-php-config=/usr/bin/php-config  --with-libmemcached-dir=/usr/local/libmemcached #make #make install 安裝成功后會(huì)生成memcached.so,把路徑加到php.ini的extension=xxx里.
    posted @ 2013-09-27 14:25 小馬歌 閱讀(537) | 評(píng)論 (0)編輯 收藏
     
    信號(hào)產(chǎn)生方式對(duì)進(jìn)程的影響
    sigint通過(guò)ctrl+c將會(huì)對(duì)當(dāng)進(jìn)程發(fā)送此信號(hào)信號(hào)被當(dāng)前進(jìn)程樹(shù)接收到,也就是說(shuō),不僅當(dāng)前進(jìn)程會(huì)收到信號(hào),它的子進(jìn)程也會(huì)收到
    sigtermkill命令不加參數(shù)就是發(fā)送這個(gè)信號(hào)只有當(dāng)前進(jìn)程收到信號(hào),子進(jìn)程不會(huì)收到。如果當(dāng)前進(jìn)程被kill了,那么它的子進(jìn)程的父進(jìn)程將會(huì)是init,也就是pid為1的進(jìn)程

    SIGQUIT
    和SIGINT類(lèi)似, 但由QUIT字符(通常是Ctrl-\)來(lái)控制. 進(jìn)程在因收到SIGQUIT退出時(shí)會(huì)產(chǎn)生core文件, 在這個(gè)意義上類(lèi)似于一個(gè)程序錯(cuò)誤信號(hào)。

    SIGSTOP
    停止(stopped)進(jìn)程的執(zhí)行. 注意它和terminate以及interrupt的區(qū)別:該進(jìn)程還未結(jié)束, 只是暫停執(zhí)行. 本信號(hào)不能被阻塞, 處理或忽略.

    SIGKILL
    強(qiáng)制殺死

    頭文件信號(hào)詳解
    /* Signals.  */
    #define SIGHUP          1       /* Hangup (POSIX).  */
    #define SIGINT          2       /* Interrupt (ANSI).  */
    #define SIGQUIT         3       /* Quit (POSIX).  */
    #define SIGILL          4       /* Illegal instruction (ANSI).  */
    #define SIGTRAP         5       /* Trace trap (POSIX).  */
    #define SIGABRT         6       /* Abort (ANSI).  */
    #define SIGIOT          6       /* IOT trap (4.2 BSD).  */
    #define SIGBUS          7       /* BUS error (4.2 BSD).  */
    #define SIGFPE          8       /* Floating-point exception (ANSI).  */
    #define SIGKILL         9       /* Kill, unblockable (POSIX).  */
    #define SIGUSR1         10      /* User-defined signal 1 (POSIX).  */
    #define SIGSEGV         11      /* Segmentation violation (ANSI).  */
    #define SIGUSR2         12      /* User-defined signal 2 (POSIX).  */
    #define SIGPIPE         13      /* Broken pipe (POSIX).  */
    #define SIGALRM         14      /* Alarm clock (POSIX).  */
    #define SIGTERM         15      /* Termination (ANSI).  */
    #define SIGSTKFLT       16      /* Stack fault.  */
    #define SIGCLD          SIGCHLD /* Same as SIGCHLD (System V).  */
    #define SIGCHLD         17      /* Child status has changed (POSIX).  */
    #define SIGCONT         18      /* Continue (POSIX).  */
    #define SIGSTOP         19      /* Stop, unblockable (POSIX).  */
    #define SIGTSTP         20      /* Keyboard stop (POSIX).  */
    #define SIGTTIN         21      /* Background read from tty (POSIX).  */
    #define SIGTTOU         22      /* Background write to tty (POSIX).  */
    #define SIGURG          23      /* Urgent condition on socket (4.2 BSD).  */
    #define SIGXCPU         24      /* CPU limit exceeded (4.2 BSD).  */
    #define SIGXFSZ         25      /* File size limit exceeded (4.2 BSD).  */
    #define SIGVTALRM       26      /* Virtual alarm clock (4.2 BSD).  */
    #define SIGPROF         27      /* Profiling alarm clock (4.2 BSD).  */
    #define SIGWINCH        28      /* Window size change (4.3 BSD, Sun).  */
    #define SIGPOLL         SIGIO   /* Pollable event occurred (System V).  */
    #define SIGIO           29      /* I/O now possible (4.2 BSD).  */
    #define SIGPWR          30      /* Power failure restart (System V).  */
    #define SIGSYS          31      /* Bad system call.  */
    #define SIGUNUSED       31
    posted @ 2013-09-26 12:39 小馬歌 閱讀(305) | 評(píng)論 (0)編輯 收藏
    僅列出標(biāo)題
    共95頁(yè): First 上一頁(yè) 22 23 24 25 26 27 28 29 30 下一頁(yè) Last 
     
    主站蜘蛛池模板: 亚洲国产成人手机在线电影bd| 国产免费黄色大片| 国产精品色拉拉免费看| 亚洲国产精品一区二区久| 亚洲丶国产丶欧美一区二区三区 | 国产亚洲成av片在线观看| 亚洲videos| 亚洲另类无码一区二区三区| 久久免费香蕉视频| 无人在线观看免费高清视频| 亚洲一区爱区精品无码| 久久亚洲伊人中字综合精品| 亚洲av午夜电影在线观看 | 99re6免费视频| 国产免费AV片在线播放唯爱网| 手机在线免费视频| 久久久久久亚洲精品| 亚洲欧洲日产国码在线观看| g0g0人体全免费高清大胆视频| 精品国产污污免费网站| 波多野结衣久久高清免费| 亚洲精选在线观看| 免费无码AV一区二区| 久久久久成人片免费观看蜜芽 | 亚洲网站免费观看| 亚洲综合久久夜AV | 亚洲国产成人精品无码区二本| 无人视频免费观看免费视频| 91成年人免费视频| 亚洲国产成人片在线观看无码| 亚洲免费网站在线观看| 久草免费福利视频| 亚洲免费日韩无码系列| 亚洲一区二区三区成人网站| 无码AV片在线观看免费| 自拍偷自拍亚洲精品情侣| 老司机午夜精品视频在线观看免费 | 亚洲AV成人精品日韩一区| 99久久久精品免费观看国产| 免费一看一级毛片| 国产国拍亚洲精品mv在线观看|