整合營銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          PHP與Node.js:一個史詩般開發(fā)者的分享

          PHP與Node.js:一個史詩般開發(fā)者的分享

          個老朋友之間最終以戰(zhàn)斗的方式分開,這是經(jīng)典的好萊塢情節(jié),通常,摩擦開始于一個人對另一個人的說話不感興趣時。在編程語言這部電影中,Node.js的引入使得朋友輕易地變成了怨恨對手:PHP和JavaScript,兩個合作伙伴曾經(jīng)一起統(tǒng)治互聯(lián)網(wǎng),但現(xiàn)在卻彼此分開。

          過去的合作關(guān)系很簡單。JavaScript處理瀏覽器上的細(xì)節(jié),而PHP管理80端口和MySQL之間的所有服務(wù)器端任務(wù)。這是一個幸福的聯(lián)盟,支持互聯(lián)網(wǎng)的許多關(guān)鍵部分。在WordPress,Drupal和Facebook之間,人們幾乎在網(wǎng)絡(luò)上的每一分鐘都有PHP的參與。

          然后一些聰明的開發(fā)者發(fā)現(xiàn)JavaScript可以用在服務(wù)器上。突然,沒有必要使用PHP來構(gòu)建服務(wù)器堆棧了。一種語言既可以構(gòu)建Node.js,也是客戶端運(yùn)行框架所需要的。“JavaScript無處不在”成為了一些人的口頭禪。

          從那時起,兩個平臺都不斷地擴(kuò)大和改進(jìn)。Node.js的開發(fā)人員現(xiàn)在可以選擇一個不斷擴(kuò)充的優(yōu)秀框架集合:Express,Angular,Meteor等。列表很長,最大的問題是選擇最優(yōu)秀最合適的。

          PHP也加快了速度,zippy即時編譯器提供的答案比以前更快。現(xiàn)在的PHP 7.0和HHVM都為Chrome和Node.js提供了相同的即時優(yōu)化引擎V8。不僅如此,HHVM還有一個Hack,它對諸如lambda,泛型和集合等復(fù)雜編程特性提供完全支持。

          有人稱贊Node.js和JavaScript,也有人對PHP的代碼基礎(chǔ)和穩(wěn)定性感到滿意。JavaScript還會和它的老朋友一起實現(xiàn)統(tǒng)治世界嗎?

          PHP特點:混合代碼

          如果你想添加一個分支,一個if-then語句就可以,看起來也很漂亮。或者也許你想混合文本或數(shù)據(jù)庫中的數(shù)據(jù)。使用PHP,打開PHP標(biāo)簽,幾秒鐘就可以開始編寫代碼。不需要模板,因為一切都是模板!不需要額外的文件或精心設(shè)計的架構(gòu),只需要你的指尖編程。

          Node特點:代碼分離

          混合代碼可能最終不是什么好事。雖然,這件事很有趣,但很快你的代碼就會變的邏輯混亂。真正的程序員會添加結(jié)構(gòu)并將基礎(chǔ)層與邏輯層分離。這使代碼對新程序員來說更加清晰,易于理解和維護(hù)。在Node.js上運(yùn)行的框架由程序員構(gòu)建,程序員知道模型,視圖和控制器分開是最好的。

          PHP特點:深度代碼庫

          網(wǎng)絡(luò)中充滿了PHP代碼。用于構(gòu)建網(wǎng)站(WordPress,Drupal,Joomla)的最流行的平臺是用PHP編寫的。不僅平臺是開源的,大多數(shù)的插件也是如此。PHP代碼無處不在。

          Node特點:更新的代碼意味著更現(xiàn)代的功能

          當(dāng)然,有成千上萬偉大的開源PHP文件,但誰想要花幾個小時,幾天或幾個星期的時間研究幾年沒有更新的代碼呢?Node.js插件不僅更新,而且是建立在最新的架構(gòu)方法上的。它們由程序員構(gòu)建,程序員知道現(xiàn)代網(wǎng)絡(luò)應(yīng)用程序應(yīng)將大部分智能推送給客戶端。

          PHP特點:簡單(排序)

          PHP沒有太多的東西:一些變量和基本的函數(shù),用于編譯字符串和數(shù)字。除了將數(shù)據(jù)從80端口移動到數(shù)據(jù)庫和回來之外做的不多,PHP是一個不復(fù)雜的工作所需的。

          Node特點:復(fù)雜的閉包

          JavaScript可能有許多小的特性,但在大多數(shù)情況下,它是一種現(xiàn)代語言,運(yùn)行現(xiàn)代語法和一些有用的功能,如閉包。你可以很容易地重新配置和擴(kuò)展它,使強(qiáng)大的庫比如jQuery成為可能,你可以傳遞類似對象的函數(shù)。

          PHP特點:新代碼正在建立

          如果你是一個程序員,想要做的不僅僅是與數(shù)據(jù)庫交互,而是對結(jié)果進(jìn)行格式化,現(xiàn)在你可以使用PHP做很多事情。Facebook的HHVM添加了對Hack的支持,Hack是一個完整的語言,充滿了類型注釋,泛型和lambda表達(dá)式等現(xiàn)代特性。使用這個會限制代碼只運(yùn)行在HHVM上。

          Node特點:幾十種語言選項

          如果PHP用戶樂意訪問Hack,他們應(yīng)該考慮遷移到Node.js世界,因為許多主要語言可以交叉編譯以在JavaScript中運(yùn)行,如Java,C#或Lisp和Scala,OCaml和Haskell。

          PHP特點:無需客戶端應(yīng)用程序

          在瀏覽器和服務(wù)器上使用相同的語言是很好的,但如果你不需要在瀏覽器上使用任何語言怎么辦? 如果以HTML格式發(fā)送數(shù)據(jù)怎么辦? 純HTML比其他任何東西都更頻繁地被使用,并且PHP已經(jīng)被優(yōu)化以創(chuàng)建它,既然如此,為什么還要在瀏覽器上使用JavaScript?

          Node特點:高效交付的基礎(chǔ)

          如果你愿意花時間創(chuàng)建一個漂亮的瀏覽器端網(wǎng)絡(luò)應(yīng)用程序,Node.js經(jīng)過優(yōu)化,可通過Web服務(wù)提供數(shù)據(jù)。如果你的應(yīng)用程序很復(fù)雜,數(shù)據(jù)豐富,這是高效交付的良好基礎(chǔ)。

          PHP特點:SQL

          PHP被構(gòu)建為與MySQL及其許多變體(如MariaDB)共存。如果MySQL不完全正確,還有來自O(shè)racle和Microsoft的其他SQL數(shù)據(jù)庫。代碼可以對查詢進(jìn)行一些更改。 一些穩(wěn)定的,開發(fā)良好的代碼將與SQL數(shù)據(jù)庫相連接,這意味著也可以輕松地集成到PHP項目中。

          Node.js特點:JSON

          不是說不能為PHP堆棧獲得JSON庫,但使用JavaScript時,使用JSON更簡單靈活。它是從瀏覽器到Web服務(wù)器到數(shù)據(jù)庫的一種語法。

          PHP特點:編碼速度

          對于大多數(shù)開發(fā)人員,為Web應(yīng)用程序編寫PHP感覺更快:沒有編譯器,沒有部署,沒有JAR文件或預(yù)處理器,只是你最喜歡的編輯器和一些目錄中的PHP文件。當(dāng)一個項目需要快速開發(fā)時,PHP是最好的工具。

          Node.js特點:原始速度

          當(dāng)你算入大括號和括號時,編寫JavaScript代碼有點困難。它的核心在于精細(xì)準(zhǔn)確。

          PHP特點:內(nèi)部競爭

          HHVM團(tuán)隊和Zend團(tuán)隊正在努力為每個人提供快速代碼。出現(xiàn)了獨(dú)立的基準(zhǔn),每個人都將代碼推向極限,這意味著更好的性能。

          Node.js特點:融合團(tuán)結(jié)

          你真的想要兩個不同的代碼庫嗎?競爭有助于發(fā)展,但碎片化很快就會出現(xiàn)。如果你必須花幾個星期或幾個月重寫代碼,競爭不會有什么好處。雖然Node.js在幾年前經(jīng)歷了分裂,隨著io.js的推出,Node.js的Universe已經(jīng)重新統(tǒng)一了,它給了PHP開發(fā)人員很久以來未曾有過的語言團(tuán)結(jié)。

          喜歡用JavaScript編寫代碼嗎,但是對于某些項目必須使用PHP嗎?請繼續(xù)閱讀以了解如何使用有趣的圖書館將兩者結(jié)合起來。

          自2000年以來我一直在使用PHP,并且使用JavaScript的時間更長。在過去的十年里,JavaScript已經(jīng)發(fā)生了巨大的變化。它從一開始就有一個很有前途的設(shè)計,并且隨著轉(zhuǎn)向ES2015(Harmony)而獲得了目前令人難以置信的形狀。PHP雖然沒有改變那么多。顯然,它注定會永遠(yuǎn)遭受自己的遺產(chǎn)。它到達(dá)90年代中期,作為一個簡單的CGI應(yīng)用程序來維護(hù)Rasmus Lerdorf的主頁,并且更像是自發(fā)地發(fā)展起來的。這導(dǎo)致語法不一致,功能和基于OOP的資產(chǎn)混合在一起,缺乏體面的語言規(guī)范。所以每次我切換到PHP時,我都會錯過JavaScript的合理性,可預(yù)測性和靈活性。這讓我想到了一個可以為PHP帶來類似JavaScript的開發(fā)體驗的庫。最終,使用JavaScript(Underscore除外)方法擴(kuò)展PHP類型的Extras,解鎖鏈接,并引入PlainObject代表對象文字的 類型。

          JavaScript會見PHP

          該庫使用JavaScript和Underscore.js方法豐富了以下PHP類型:數(shù)組(包括順序和關(guān)聯(lián)),字符串,數(shù)字(整數(shù),浮點數(shù),NaN),函數(shù)(可調(diào)用),集合(Iterable,ArrayObject,Iterator)和布爾值。每個添加的方法都是表示類型的類的靜態(tài)方法。因此,我們可以直接訪問任何內(nèi)容,而不需要創(chuàng)建鏈 Arrays::map。

          這有什么好處?我們來看看下面的代碼片段:

          <?php

          use \Dsheiko\Extras\Arrays;

          function numToArray(int $value, int $index, array $array): array

          {

          return [$value];

          }

          $res=Arrays::map(range(1,3), "numToArray"); // [[1],[2],[3]]

          不同的是\array_map, 庫方法的接口與任何其他數(shù)組extras一致。第一個參數(shù)始終是源數(shù)組,接下來會迭代/預(yù)測回調(diào),如果需要則返回其他任何內(nèi)容。更?使用PHP數(shù)組函數(shù),我們需要記住哪一個只接受源或引用的引用。 Arrays::*方法總是接受獨(dú)立的值和引用。

          你有沒有注意到回調(diào)參數(shù)列表?是的,它根據(jù)ECMAScript規(guī)范進(jìn)行了擴(kuò)展。除了值之外,它總是接收元素索引(關(guān)聯(lián)數(shù)組中的鍵)和初始數(shù)組。

          另外,所有添加的方法都可以連接在一起:

          <?php

          use \Dsheiko\Extras\Arrays;

          $res=Arrays::chain([1, 2, 3])

          ->map(function($num){ return $num + 1; })

          ->filter(function($num){ return $num > 1; })

          ->reduce(function($carry, $num){ return $carry + $num; }, 0)

          ->value();

          對我來說,它看起來比以下更干凈:

          $array=[1, 2, 3];

          $array=\array_map(function($num){ return $num + 1; }, $array);

          $array=\array_filter($array, function($num){ return $num > 1; });

          $array=\array_reduce($array, function($carry, $num){ return $carry + $num; }, 0);

          什么其他類型呢?如果我們接受一個字符串,它的工作原理是一樣的:

          <?php

          use \Dsheiko\Extras\Strings;

          function sanitizeSearchTerm(string $value, int $maxLength): string

          {

          return Strings::chain($value)

          ->trim()

          ->replace('`[^0-9\-_ \p{L}]`u', ' ')

          ->replace('` +`', ' ')

          ->substr(0, $maxLength)

          ->value();

          }

          此外,我們還可以在同一鏈中操作多種類型:

          <?php

          use \Dsheiko\Extras\Arrays;

          $res=Arrays::chain(["foo"=> "FOO", "bar"=> "BAR"])

          // input: array, output: string

          ->reduce(function($carry, $val, $key){ return $carry . " {$key}:{$val} "; }, "")

          // input: string, output: integer

          ->indexOf("bar:")

          // input: integer, output: double

          ->toFixed(2)

          ->value();

          實際上,你甚至不需要猜測入口點的類型。相反,你可以使用類型:

          <?php

          use \Dsheiko\Extras\Any;

          $res=Any::chain(new \ArrayObject([1,2,3]))

          ->toArray() // value is [1,2,3]

          ->map(function($num){ return [ "num"=> $num ]; })

          // value is [[ "num"=> 1, ..]]

          ->reduce(function($carry, $arr){

          $carry .=$arr["num"];

          return $carry;

          }, "") // value is "123"

          ->replace("/2/", "") // value is "13"

          ->then(function($value){

          if (empty($value)) {

          throw new \Exception("Empty value");

          }

          return $value;

          })

          ->value();

          正如你在這個例子中看到的,我也使用then類似于Promise API 的鏈?zhǔn)椒椒?。它接受鏈條的實際價值,并根據(jù)鏈條是否被修改進(jìn)一步傳遞。

          Underscore.js符合PHP

          沒有說服?那么,我們對類型做了很多操作,尤其是對于數(shù)組。數(shù)組函數(shù)有助于隔離迭代范圍并提高性能,但在展示開發(fā)人員意圖時,它們并不那么方便。實際上,我們經(jīng)常解決類似的邏輯任務(wù),我們可以簡單地重用現(xiàn)有的模式。Extras庫包含一組Underscore.js方法。它有所作為。試想一下,您有一系列鍵值對象(實際上是關(guān)聯(lián)數(shù)組),其中攜帶有關(guān)劇院中所有劇本的數(shù)據(jù)。根據(jù)用戶應(yīng)用的過濾器,您需要搜索匹配的播放。每次使用回調(diào)時\array_filter, 您都可以使用 Arrays:where:

          $listOfPlays=[

          ["title"=> "Cymbeline", "author"=> "Shakespeare", "year"=> 1611],

          ["title"=> "The Tempest", "author"=> "Shakespeare", "year"=> 1611],

          ["title"=> "Hamlet", "author"=> "Shakespeare", "year"=> 1603]

          ];

          $res=Arrays::where($listOfPlays, ["author"=> "Shakespeare", "year"=> 1611]);

          // [

          // ["title"=> "Cymbeline", "author"=> "Shakespeare", "year"=> 1611],

          // ["title"=> "The Tempest", "author"=> "Shakespeare", "year"=> 1611],

          // ]

          或者,假設(shè)您有一個描述產(chǎn)品的鍵值數(shù)據(jù)結(jié)構(gòu)。您需要提取包含您選擇的唯一對的較小對象(此處為關(guān)聯(lián)數(shù)組):

          $res=Arrays::pick([

          'name'=> 'moe',

          'age'=> 50,

          'userid'=> 'moe1',

          //… 100 more lines

          ], 'name', 'age');

          // ['name'=> 'moe', 'age'=> 50, ]

          正如您可能注意到的,Extras可以反映PHP數(shù)組中的JavaScript類型數(shù)組和對象(分別為順序和關(guān)聯(lián))。此外,可以從中獲得類似于JavaScript普通對象的類型:

          use \Dsheiko\Extras\Arrays;

          $po=Arrays::object(["foo"=> "FOO", "bar"=> ["baz"=> "BAZ"]]);

          echo $po->foo; // FOO

          echo $po->bar->baz; // BAZ

          該類型繼承了Underscore Object方法:

          use \Dsheiko\Extras\Arrays;

          $po=Arrays::object([

          "start"=> 5,

          "end"=> 12,

          ]);

          $res=$po->mapObject(function($val){

          return $val + 5;

          }) // PlainObject{ "start": 10, "end": 17 }

          ->invert(); // PlainObject{ 10: "start", 17: "end" }

          概括

          Extras是一個可通過作曲者使用的PHP包:

          composer require "dsheiko/extras"

          它旨在改進(jìn)PHP的開發(fā)體驗。也就是說,它提供了一種具有一致的命名約定和一致的參數(shù)順序的類型操縱工具帶。任何交付的方法都是可鏈接的。除了PHP泛型類型之外,該軟件包還帶有PlainObject,它類似于JavaScript普通對象。包方法遵循相應(yīng)的JavaScript和Underscore.js / Lodash方法的語法和邏輯。

          TML+PHP超大視頻上傳實例,PHP批量上傳大文件技巧,PHP批量上傳大文件,PHP實現(xiàn)批量上傳圖片的技巧,PHP結(jié)合WEB UPLOADER插件實現(xiàn)分段,PHP結(jié)合WEB UPLOADER插件實現(xiàn)切片上傳,PHP結(jié)合WEB UPLOADER插件實現(xiàn)斷點續(xù)傳,PHP結(jié)合WEB UPLOADER插件實現(xiàn)大文件上傳,PHP結(jié)合UPLOADER插件實現(xiàn)分片上傳文件,PHP結(jié)合百度UPLOADER插件實現(xiàn)分片上傳文件,PHP結(jié)合WEB UPLOADER插件實現(xiàn)分片上傳文件,前端HTML5,JS,JQ,VUE2,VUE3,React,

          前端的話都有可能用到,VUE2,VUE3,HTML5,也不一定是VUE, 公司內(nèi)部有自己的產(chǎn)品,有些產(chǎn)品是之前開發(fā)的,沒有用VUE,而是用的普通的HTML模板,用的也還好。

          后端PHP5,PHP6,PHP7,PHP8,ThinkPHP,

          客戶是武漢這邊的一家企業(yè)。

          webuploader的組件公司研發(fā)部的同事也調(diào)研過,研究過他的實現(xiàn),實際上他就是對Flash和HTML5進(jìn)行了一個封裝,本質(zhì)還是調(diào)的HTML5的API,兼容性不是特別好。可擴(kuò)展性也比較差,可維護(hù)性就更不用說了,之前公司項目遇到過坑,到現(xiàn)在連webuploader開發(fā)人員都聯(lián)系不上。想找他們尋求一點技術(shù)支持的幫助,真的是想都不要想。公司這一塊也愿意付費(fèi),就是付費(fèi)尋求的技術(shù)支持,也不行。這一點真的讓哥幾個給整郁悶了。領(lǐng)導(dǎo)也不太滿意,所以還是找有技術(shù)支持的產(chǎn)品。研發(fā)部的同事稱這些項目是免費(fèi)坑人項目。

          服務(wù)器支持Linux,Windows,macOS,CentOS,中標(biāo)麒麟,銀河麒麟,統(tǒng)信,龍芯,華為鯤鵬,

          數(shù)據(jù)庫支持MySQL,達(dá)夢數(shù)據(jù)庫,人大金倉

          需要提供前端源碼,后端源碼,控件源碼

          需要提供7*24小時技術(shù)支持,長期技術(shù)支持,長期維護(hù)服務(wù)

          需要提供手機(jī),QQ,微信,企業(yè)微信,電子郵箱等聯(lián)系方式

          需要支持包含IE在內(nèi)的全部瀏覽器

          終端需要支持Windows,macOS,Linux,信創(chuàng)國產(chǎn)化環(huán)境,中標(biāo)麒麟,銀河麒麟,統(tǒng)信UOS,龍芯,華為

          功能需要支持10G,50G,100G大文件上傳和斷點續(xù)傳,刷新續(xù)傳,重啟續(xù)傳

          支持超大文件分片,分段,分塊,分割上傳下載,斷點續(xù)傳

          支持文件夾上傳,下載斷點續(xù)傳,支持文件夾層級結(jié)構(gòu),層級結(jié)構(gòu)信息保存到數(shù)據(jù)庫,下載的時候同樣保留層級結(jié)構(gòu)

          支持加密上傳,下載加密,端到端加密,國密SM4加密算法,數(shù)據(jù)加密傳輸,傳輸過程中要保證數(shù)據(jù)是加密的。

          版本:6.5.40

          代碼:https://gitee.com/xproer/up6-php/tree/6.5.40/

          安裝環(huán)境

          PHP:7.2.14

          調(diào)整塊大小

          NOSQL

          NOSQL不需要任何配置,可以直接訪問測試

          SQL

          創(chuàng)建數(shù)據(jù)庫

          您可以直接復(fù)制腳本進(jìn)行創(chuàng)建

          配置數(shù)據(jù)庫連接

          6.安裝依賴

          訪問頁面進(jìn)行測試

          數(shù)據(jù)表中的數(shù)據(jù)

          相關(guān)參考:

          文件保存位置

          php5教程,

          源碼工程文檔:https://drive.weixin.qq.com/s?k=ACoAYgezAAw1dWofra

          源碼報價單:https://drive.weixin.qq.com/s?k=ACoAYgezAAwoiul8gl

          OEM版報價單:https://drive.weixin.qq.com/s?k=ACoAYgezAAwuzp4W0a
          控件源碼下載:https://drive.weixin.qq.com/s?k=ACoAYgezAAwbdKCskc


          主站蜘蛛池模板: 相泽南亚洲一区二区在线播放 | 亚洲中文字幕乱码一区| 久久99久久无码毛片一区二区| 一区二区三区免费在线视频| 国产探花在线精品一区二区| 中文字幕人妻丝袜乱一区三区| 风间由美性色一区二区三区| 日本欧洲视频一区| 天美传媒一区二区三区| 无码人妻精品一区二区三区99仓本 | 国产精品视频分类一区| 日韩一区二区三区免费播放| 中文字幕一区视频| 亚洲夜夜欢A∨一区二区三区| 国产一区二区在线观看麻豆 | 国产99精品一区二区三区免费| 国产主播一区二区| 视频一区二区三区人妻系列| 无码中文人妻在线一区二区三区| 亚洲无删减国产精品一区| 国产AV国片精品一区二区| 国产精品高清一区二区人妖| 日韩电影一区二区三区| 国产精品无码一区二区三区电影 | 亚洲一区二区三区四区视频| 亚洲乱码av中文一区二区| 国产精品污WWW一区二区三区| 78成人精品电影在线播放日韩精品电影一区亚洲 | 精品福利一区3d动漫| 久久精品无码一区二区三区不卡| 精品久久一区二区三区| 国产99精品一区二区三区免费| 国产日韩精品一区二区在线观看| 国产对白精品刺激一区二区| 性色AV一区二区三区| A国产一区二区免费入口| 精品亚洲一区二区三区在线播放| 国产一区二区在线观看视频| 欧洲精品免费一区二区三区| 国模无码视频一区二区三区| 精品一区二区ww|