Sử dụng npm trong dự án php

Trong khi mức độ phổ biến của Node. js đang tăng, lực kéo của PHP đang giảm. Với bối cảnh đó, bài đăng này sẽ giải thích chi tiết về 5 khía cạnh thực tế cần biết khi sử dụng Node. js cho nhà phát triển PHP. Đây sẽ là những điều không ai nói hoặc viết về, đã đến lúc bắt đầu

Mục lục

Nút. js dành cho nhà phát triển PHP [không phải Node. js so với PHP]

Phần này là danh sách những thứ mà bạn với tư cách là nhà phát triển PHP phải biết và học cách sử dụng Node. js hiệu quả. Ngược lại, bài đăng này không phải là Nút. js vs PHP viết lên nơi PHP bị bash. Tôi đã sử dụng cả hai ngôn ngữ. Tôi bắt đầu viết thêm Node. j vào năm 2016. Khi tôi bắt đầu, tôi gặp một số khó khăn vì tôi đã quen với PHP trong công việc hơn 7 năm trước đó. Có một cuốn sách được phát hành vào cuối năm 2012 về Node. js cho nhà phát triển PHP

Bài đăng trên blog này sẽ không nói về PHP hay Node là gì. js là gì, bạn có thể đọc về nó trong các bài viết khác. Tôi cũng sẽ không nói nhiều về Non-Blocking I/O hay event loop. Tuy nhiên, một số nội dung sẽ được lướt qua khi thảo luận về các khía cạnh thực tế của việc viết Node tốt. mã js

Nút. js cho các nhà phát triển PHP về khía cạnh thực tế

PHP đã tồn tại từ năm 1995 và được cho là vẫn được sử dụng bởi 79. % trang web được giám sát bởi W3tech [tôi thực sự không thể nói nếu đó là toàn bộ internet]. Vì vậy, rất có thể bạn đã sử dụng PHP hoặc triển khai thứ gì đó được viết bằng PHP. Ví dụ với xu hướng phát triển

WordPress được sử dụng bởi 63. 7% trong số tất cả các trang web có hệ thống quản lý nội dung mà chúng tôi biết. Đây là 39. 0% của tất cả các trang web được giám sát bởi W3Tech

Mặt khác, nút. js được phát hành vào năm 2009. Các công ty công nghệ lớn như Linked In và Paypal bắt đầu áp dụng nó từ năm 2011 đến 2013 vì nhiều lý do như microservice. Theo khảo sát nhà phát triển Stack Overflow của

Năm thứ hai liên tiếp, Node. js chiếm vị trí hàng đầu, vì nó được sử dụng bởi một nửa số người được hỏi

Không có gì bí mật khi Node. js đang trở nên rất phổ biến trong 5 năm qua

Vì vậy, là một nhà phát triển PHP, đây là 5 điều thiết thực cần biết để trở thành một Node tuyệt vời. kỹ sư phần mềm js. Nút. js dành cho nhà phát triển PHP tương tự ở một số khía cạnh nhưng cũng khác ở một số khía cạnh khác, một số được mô tả bên dưới

Nút. js thực thi mã không đồng bộ và không tuần tự

Đây là một hành vi đánh lừa rất nhiều nhà phát triển PHP. Trong PHP, mã chạy theo thứ tự, ở dòng đầu tiên 1 rồi 2, v.v. Trong Javascript và đặc biệt là trong Node. js có thể không phải như vậy. Bạn có khả năng có thể đặt mọi thứ ở chế độ nền bằng cách sử dụng tốt các lời hứa và cuộc gọi lại

Dưới đây là một ví dụ về mã đã sửa đổi với lời giải thích được lấy từ kho mã nguồn mở của tôi

async function getExternal[fromCurrency, toCurrency, onDate] {
const rate = await getRate[fromCurrency, toCurrency, onDate];
db.query[
`INSERT INTO exchange_rates [from_currency, to_currency, rate, on_date] VALUES [?,?,?,?] ON DUPLICATE KEY UPDATE rate = ?`,
[fromCurrency, toCurrency, rate, onDate, rate]
].then[result => {
if [result.affectedRows === 0] {
console.error[`Exchange rate of ${rate} for ${fromCurrency} to ${toCurrency} on ${onDate} could not be saved`];
}
}].catch[err => {
console.log[`Error while writing to db: `, err];
}]; //this is done async for the API to respond faster

console.log[`Fetched exchange rate of ${rate} for ${fromCurrency} to ${toCurrency} of ${onDate} from the API`];
return { fromCurrency, toCurrency, onDate, rate };
}

Nếu bạn nhìn kỹ hơn, thì db.query trông ngây thơ đó ở dòng 3, đã bị đẩy vào hậu cảnh. Vì vậy, nó sẽ thực hiện như dưới đây

  1. Nhận tỷ lệ
  2. Chạy truy vấn chèn trong nền
  3. Trong khi phần chèn đang chạy, hàm đã được trả về tỷ lệ
  4. Nếu có vấn đề trong truy vấn chèn, nó sẽ được ghi vào phần bắt

Không có cách nào khác để làm điều gì đó như thế này trong PHP. Đây là điều đầu tiên khiến các nhà phát triển PHP bối rối. Nó làm cho Node khó hiểu hơn. js cho nhà phát triển PHP. Hành vi thực thi mã không đồng bộ này cũng làm cho việc tìm đúng dấu vết ngăn xếp khó khăn hơn trong trường hợp có lỗi trong Node. js

Thành thật mà nói, vào năm 2020, bạn có thể dễ dàng sử dụng async đang chờ. Mặc dù nó là đường cú pháp trên Promises, nhưng nó làm cho việc lập trình không đồng bộ trở nên dễ dàng hơn rất nhiều. Khi tôi bắt đầu ở kỷ nguyên Node 4/6 vào khoảng năm 2016 với các cuộc gọi lại và Lời hứa, đó hoàn toàn là một trò chơi bóng khác. Tuy nhiên, hãy cẩn thận khi không sử dụng async-await [như trên] và chỉ thực hiện theo lời hứa, sau đó và bắt. Mặc dù vậy, đừng vướng vào địa ngục hứa hẹn trong quá trình này. Địa ngục lời hứa giống như lần lặp lại tiếp theo của địa ngục gọi lại

mẹo chuyên nghiệp. Để biết những tính năng ES6 nào bạn có thể sử dụng với phiên bản Node nào. js, hãy kiểm tra nó tại nút. màu xanh lá

Một mẹo chuyên nghiệp khác

nút chẵn. phiên bản js là LTS, phiên bản lẻ thì không. Vì vậy, hãy sử dụng Nút 16 hoặc 18 chứ không phải 15 hoặc 17 trong sản xuất

Đi sâu hơn một chút vào việc thực hiện không tuần tự, lời hứa và sức mạnh của nó đóng một vai trò quan trọng ở đây. Khả năng làm những việc đồng thời là tuyệt vời trong Node. js và javascript nói chung

Nút. js hứa hẹn khả năng

Hứa hẹn không đồng bộ, bạn có thể chạy chúng đồng thời. Có nhiều cách để làm điều đó. Bạn có thể đua 3 lời hứa và nhận kết quả từ lời hứa nhanh nhất. Bạn thậm chí có thể hứa. tất cả nếu một lời hứa bị từ chối, nó sẽ dừng toàn bộ hoạt động. Vui lòng đọc thêm về Promise.race, promise.all

const ONE_MINUTE_IN_MS = 60000;
const options = {
maxAge: ONE_MINUTE_IN_MS,
cacheKey: [arguments_] => arguments_.join[','],
};

app.get['/api/products', async [req, res, next] => {
try {
const memGetProducts = pMemoize[products.getMultiple, options];
res.json[await memGetProducts[req.query.page || 1, req.query.search]];
} catch [err] {
next[err];
}
}];
0 trong phần so sánh tuyệt vời này

Với ý nghĩ đó, bạn có thể thử các thư viện NPM khác để hạn chế đồng thời lời hứa hoặc thậm chí lọc qua các lời hứa đồng thời. Bạn có thể làm một số điều đó với ReactPHP. Nhưng nó không có trong PHP gốc, thậm chí không có trong PHP 8. Đây là một cái gì đó mới mẻ để thu hút sự chú ý của bạn trong Node. js cho nhà phát triển PHP

Hãy chuyển sang điểm tiếp theo, quy trình không cần phải chết trong Node. js như trong PHP

Nút. js chạy lâu, không giống như PHP

PHP chết không phải theo nghĩa là nó sẽ không được sử dụng. Theo nghĩa là tất cả các quy trình PHP phải chết. PHP không thực sự được thiết kế cho các tác vụ/quy trình chạy dài. Trong PHP khi một yêu cầu HTTP mới bắt đầu xử lý, sau khi gửi phản hồi trở lại, quy trình sẽ bị hủy. Đó là cách PHP hoạt động. Điều đó tạo ra nhu cầu về FPM và các máy chủ khác. Bạn có thể tranh luận rằng PHP không có máy chủ theo thiết kế hơn 20 năm trước. Tôi để điều đó cho bạn

Mặt khác, Nút. js là một quá trình chạy dài. Điều này cho phép bạn chia sẻ thông tin giữa các yêu cầu vì cùng một máy chủ/quy trình đang xử lý nhiều yêu cầu. Với quy trình chạy dài, bạn có thể dễ dàng khai thác những thứ như ghi nhớ trên bộ nhớ và tổng hợp kết nối cho cơ sở dữ liệu. Nó mở ra những khả năng khác như đếm số không. ví dụ về các yêu cầu đồng thời trên quy trình đó

Ví dụ ghi nhớ

Nếu bạn không biết Memoization

Ghi nhớ là một chức năng bậc cao lưu trữ một chức năng khác. Nó có thể biến một số chức năng chậm thành nhanh. Nó lưu kết quả của một lệnh gọi hàm sau lần đầu tiên vào bộ đệm, vì vậy nếu bạn gọi lại hàm với cùng các đối số, nó sẽ tìm thấy nó trong bộ đệm

Nó có thể được sử dụng trong Nút. js nhưng không phải trong PHP nguyên bản. Một số cách giải quyết khác có thể thực hiện được trong PHP như lưu giá trị trả về của hàm trong Redis

Dưới đây là một mẫu mã ghi nhớ trên tuyến tốc hành với p-memoize

const ONE_MINUTE_IN_MS = 60000;
const options = {
maxAge: ONE_MINUTE_IN_MS,
cacheKey: [arguments_] => arguments_.join[','],
};

app.get['/api/products', async [req, res, next] => {
try {
const memGetProducts = pMemoize[products.getMultiple, options];
res.json[await memGetProducts[req.query.page || 1, req.query.search]];
} catch [err] {
next[err];
}
}];

Ưu điểm rõ ràng của việc này là tải ít hơn trên kho dữ liệu. Trong 1 phút, nó sẽ phản hồi lại với cùng một phản hồi cho cùng một tham số. Đầu ra của hàm

const ONE_MINUTE_IN_MS = 60000;
const options = {
maxAge: ONE_MINUTE_IN_MS,
cacheKey: [arguments_] => arguments_.join[','],
};

app.get['/api/products', async [req, res, next] => {
try {
const memGetProducts = pMemoize[products.getMultiple, options];
res.json[await memGetProducts[req.query.page || 1, req.query.search]];
} catch [err] {
next[err];
}
}];
1 được lưu trong bộ nhớ trong một phút. Điều này làm cho phản hồi rất nhanh. Bạn nên đọc thêm về ghi nhớ javascript

Ví dụ nhóm kết nối với MySQL

Một điều khác không thể xảy ra do quá trình chết trong PHP là tổng hợp kết nối. Theo Wikipedia

Trong công nghệ phần mềm, nhóm kết nối là bộ đệm của các kết nối cơ sở dữ liệu được duy trì để các kết nối có thể được sử dụng lại khi cần có yêu cầu cơ sở dữ liệu trong tương lai. Nhóm kết nối được sử dụng để nâng cao hiệu suất thực thi các lệnh trên cơ sở dữ liệu

Vì vậy, bạn sẽ có 5 kết nối trong một nhóm và nếu bạn muốn chạy 5 truy vấn tới cơ sở dữ liệu thì có thể thực hiện đồng thời. Điều này giúp tiết kiệm thời gian cho cả việc kết nối với cơ sở dữ liệu cũng như chạy truy vấn. Điều này rất dễ thực hiện trong Node. js nhưng không dễ dàng thực hiện được trong PHP

Hãy chú ý đến số lượng kết nối có sẵn và để giữ cho kích thước nhóm kết nối của bạn ở mức tối ưu

Chẳng hạn, nếu bạn đang sử dụng Kubernetes và ứng dụng của bạn có 5 nhóm với kích thước nhóm kết nối là 2. Điều đó có nghĩa là cơ sở dữ liệu của bạn sẽ luôn có 10 kết nối mở mặc dù không có truy vấn nào được thực hiện

Thời gian cho một ví dụ nhóm kết nối với cơ sở dữ liệu MySQL với mô-đun npm

var pool  = mysql.createPool[{
connectionLimit : 5,
host : 'example.org',
user : 'app',
password : 'pass',
database : 'schema'
}];

for[var i=0;i Settings và trong hộp tìm kiếm gõ “node debug”. Trong tab Tiện ích mở rộng, sẽ có một tiện ích mở rộng có tiêu đề “Gỡ lỗi nút”. Từ đây, nhấp vào ô đầu tiên. Gỡ lỗi> Nút. Tự động đính kèm và đặt trình đơn thả xuống thành “bật”. Bạn gần như đã sẵn sàng để đi bây giờ. Vâng, nó thực sự là dễ dàng

Sau đó, đặt một số điểm ngắt trên mã VS bằng cách nói

const ONE_MINUTE_IN_MS = 60000;
const options = {
maxAge: ONE_MINUTE_IN_MS,
cacheKey: [arguments_] => arguments_.join[','],
};

app.get['/api/products', async [req, res, next] => {
try {
const memGetProducts = pMemoize[products.getMultiple, options];
res.json[await memGetProducts[req.query.page || 1, req.query.search]];
} catch [err] {
next[err];
}
}];
0 và trong loại thiết bị đầu cuối
const ONE_MINUTE_IN_MS = 60000;
const options = {
maxAge: ONE_MINUTE_IN_MS,
cacheKey: [arguments_] => arguments_.join[','],
};

app.get['/api/products', async [req, res, next] => {
try {
const memGetProducts = pMemoize[products.getMultiple, options];
res.json[await memGetProducts[req.query.page || 1, req.query.search]];
} catch [err] {
next[err];
}
}];
1

BÙM. Nút từng bước của bạn. trình gỡ lỗi js đang chạy tốt trên trình chỉnh sửa Mã VS mà không cần nỗ lực nhiều. Một sự khác biệt tốt so với PHP, không cần cài đặt một tiện ích mở rộng khác, kích hoạt nó và định cấu hình nó để có thể gỡ lỗi chương trình. Không cần cài đặt tiện ích mở rộng bổ sung là một lợi ích được tìm thấy trong Node. js cho nhà phát triển PHP

Điểm tiếp theo cũng là về trải nghiệm của nhà phát triển tốt hơn trong khi nâng cấp thậm chí nhiều phiên bản chính của ngôn ngữ

Nâng cấp phiên bản chính trong Node. js liền mạch hơn PHP

Nhảy thậm chí nhiều phiên bản chính trong Node. js là một trải nghiệm liền mạch. Nâng cấp từ PHP 5. x sang PHP 7. x là một quá trình kéo dài từ một tuần đến một tháng tùy thuộc vào quy mô và độ phức tạp của dự án

Theo kinh nghiệm cá nhân của tôi, tôi đã nâng cấp Node. js microservice từ phiên bản 0. 12 đến 4 trong quá khứ. Gần đây tôi đã nâng cấp một ứng dụng từ Node. js 10 đến 14. Tất cả nút của tôi. nâng cấp phiên bản chính của js thật dễ dàng

Một số gói nhỏ. json là những vấn đề nhỏ duy nhất tôi gặp phải. Sau khi triển khai, hiếm khi có bất kỳ sự cố nào liên quan đến khả năng tương thích mã. Là một phần thưởng bổ sung, hiệu suất thường tốt hơn khi nâng cấp các phiên bản chính

Mặt khác, việc nâng cấp PHP không hề dễ dàng. Nâng cấp phiên bản nhỏ cho một ứng dụng từ PHP 5. 4 đến 5. 6 không rườm rà nhiều. Nhưng, đi từ PHP 5. 6 đến 7. 2 cho một ứng dụng tương đối lớn là một nỗi đau. Phải mất một thời gian dài và cần nhiều nhà soạn nhạc. thay đổi json. Đó cũng là một nhiệm vụ khó khăn để kiểm tra nó. Mặt tốt của việc nâng cấp phiên bản chính trong PHP chắc chắn là tăng hiệu suất

Chỉ cần lưu ý ở đây, các ứng dụng PHP mà tôi đã làm việc cùng cũ hơn Node. ứng dụng js. Trải nghiệm của bạn chắc chắn có thể khác với trải nghiệm của tôi

Docker hóa một nút. ứng dụng js dễ dàng so với PHP

Mức độ phổ biến của Docker đã tăng đều đặn trong 5 năm qua. Nó đã thay đổi cách các kỹ sư phần mềm của chúng tôi làm việc kể từ khi phát hành. Bạn cũng nên sử dụng Docker để phát triển cục bộ. Với ý nghĩ đó, Dockerizing một ứng dụng PHP có thể là một nhiệm vụ khó khăn tùy thuộc vào cách các thành phần được bố trí và độ phức tạp của ứng dụng. Ngược lại, để neo một Node. js, nỗ lực ít hơn và quá trình này rất dễ dàng

Dưới đây là một ví dụ về dockerfile cho ứng dụng PHP Laravel với Apache

FROM composer:1.9.0 as build
WORKDIR /app
COPY . /app
RUN composer global require hirak/prestissimo && composer install

FROM php:7.3-apache-stretch
RUN docker-php-ext-install pdo pdo_mysql

EXPOSE 8080
COPY --from=build /app /var/www/
COPY docker/000-default.conf /etc/apache2/sites-available/000-default.conf
COPY .env.example /var/www/.env
RUN chmod 777 -R /var/www/storage/ && \
echo "Listen 8080" >> /etc/apache2/ports.conf && \
chown -R www-data:www-data /var/www/ && \
a2enmod rewrite

Điều tốt với hình ảnh Docker này cho Laravel là PHP được gói cùng với apache trong cùng một hình ảnh. Có thể tranh luận nếu đây là cách tốt hơn để làm điều đó hơn là chia PHP và Apache thành hai hình ảnh docker

Cũng lưu ý bản dựng docker nhiều giai đoạn trong hình ảnh docker ở trên. Cài đặt trình soạn thảo được thực hiện trong một hình ảnh khác và đầu ra được sao chép vào hình ảnh chính. Nếu chúng tôi đã sử dụng PHP-FPM và Nginx trong các hình ảnh docker khác nhau, nó sẽ phức tạp hơn. Sẽ cần phải quản lý hai hình ảnh docker riêng biệt

Bây giờ là lúc để xem một Node. js Dockerfile

FROM node:18-alpine as base

WORKDIR /src
COPY package.json package-lock.json /src/
COPY . /src
EXPOSE 8080

FROM base as production

ENV NODE_ENV=production
RUN npm install

CMD ["node", "index.js"]

FROM base as dev

ENV NODE_ENV=development
RUN npm config set unsafe-perm true && npm install -g nodemon
RUN npm install
CMD ["npm", "start"]

Là nút. js có một máy chủ web tích hợp, Dockerfile sạch hơn nhiều

Khi bạn cài đặt nút, npm sẽ đi kèm với nó. Điều này giúp loại bỏ nhu cầu cài đặt các gói ở một giai đoạn khác trong bản dựng docker

Trong bản dựng docker nhiều giai đoạn Dockerfile ở trên được sử dụng để phân tách hình ảnh docker sản xuất và phát triển. Có gói trình quản lý gói [npm] và có máy chủ web như một phần của ngôn ngữ/thời gian chạy là một điều khác biệt trong Node. js cho nhà phát triển PHP. Nếu bạn quan tâm nhiều hơn đến Dockering một nút. js applicaiton từng bước theo hướng dẫn này. Ngoài ra, gật đầu chỉ được cài đặt trong giai đoạn phát triển vì nó sẽ chỉ được sử dụng để phát triển

Phần kết luận

Khi sử dụng Nút. js cho các nhà phát triển PHP, nó cần một sự thay đổi nhẹ trong suy nghĩ để khai thác sức mạnh của Node. js tốt. Nút. js không phải là viên đạn bạc. Có những hạn chế và nó cần thích ứng với các cách thực thi mã khác nhau

Chắc chắn, có một số lợi ích khi sử dụng Node. js dành cho các nhà phát triển PHP như lập trình không đồng bộ và đồng thời. Các lợi thế khác bắt nguồn từ Node. quá trình js đang chạy dài

Tôi có thể sử dụng npm cho dự án PHP không?

. Đây là chức năng tiêu chuẩn của Laravel.

Làm cách nào để sử dụng npm với PHP?

Các bước cài đặt Node. .
Nhấp vào nút Tiện ích bên cạnh nút ứng dụng của bạn
Nhấp vào Cài đặt bên dưới Nút. js và NPM cho PHP
Chọn nút. js và xác nhận cài đặt. Khi Tiện ích bổ sung được cài đặt, môi trường của bạn đã sẵn sàng để sử dụng Nút. js và npm. 2441

Chúng ta có thể sử dụng Nodejs với PHP không?

Cách dễ nhất để đạt được điều này là chạy cả Node. js và PHP trên cùng một máy chủ, nhưng trên các cổng khác nhau . một nút. js sau đó có thể thực hiện một yêu cầu HTTP cục bộ tới máy chủ PHP và thực hiện điều gì đó với phản hồi.

Sử dụng lệnh npm ở đâu?

npm là trình quản lý gói cho nền tảng Node JavaScript. Nó đặt các mô-đun tại chỗ để nút có thể tìm thấy chúng và quản lý các xung đột phụ thuộc một cách thông minh. Nó có cấu hình cực cao để hỗ trợ nhiều trường hợp sử dụng khác nhau. Thông thường nhất, nó được sử dụng để xuất bản, khám phá, cài đặt và phát triển các chương trình nút .

Chủ Đề