Ẩn ảnh trong thư viện
Không biết bạn làm việc với hệ điều hành thuộc họ Unix (MacOS, Linux), hay Windows?
Nếu là Unix thì mọi thứ rất đơn giản, các file trong Unix mà bắt đầu bằng dấu .
thì đều là file ẩn, nên bạn chỉ cần thêm dấu .
và đầu tên file là được.
Còn trong Windows thì hidden là một thuộc tính của file hay folder, bạn cần chạy lệnh để thay đổi attribute này. Bạn có thể viết một đoạn code để exec lệnh hệ thống attrib -s -h -r path/to/you/file
để set flag hidden cho file.
Vấn đề đồng bộ thư mục giữa container và máy host
Theo mình hiểu thì bạn đang gặp vấn đề về việc bạn đã có sẵn một Docker Image với thư mục /app/public
và /app/log
có nội dung ở trong đó. Và khi chạy Docker Compose thì bạn mount thư mục ở máy host vào, và 2 thư mục /app/public
, /app/log
bị mất dữ liệu?
Nếu đúng là như thế thì mình xin giải thích như sau:
- Docker sẽ tạo ra volume và tiến hành
mount
volume đó vào thư mục bạn đã chỉ định trong container. Như vậy dữ liệu cũ trong container sẽ bịmask
bởi dữ liệu ở máy host (chứ không phải bị ghi đè, bạn vào trong container, gõdf -h
thì sẽ thấy thư mục đang được mount, và nếu unmout thư mục (để dùng được lệnhumount
trong container, bạn cần chạy container với tham số--privileged
) bạn sẽ thấy lại được dữ liệu cũ trong đó). Thế nên việc không thể access dữ liệu cũ vốn có ở trong container là không thể. - Chính vì những lý do trên, những folder trong container mà bạn cần mount thư mục ở máy host vào thì bạn không nên để gì trong đó, chúng chỉ nên là những folder trống (hoặc không tồn tại ). Nếu bạn muốn copy nội dung bên trong container ra ngoài trước khi volume được mount thì có lẽ phải tự thực hiện gõ lệnh manual để dựng container lên rồi copy thôi
Một chút lưu ý nhỏ. Với nội dung docker-compose.yml
như thế này
volumes:
- "/tmp/:/app/public"
- "/tmp/:/app/log"
thì cùng thư mục /tmp
sẽ được mount vào cả 2 thư mục /app/public
với /app/log
, hay nói cách khác, 2 thư mục /app/public
và /app/log
sẽ có nội dung giống nhau. Bạn nên mount kiểu “/tmp/public:/app/public”
và “/tmp/log:/app/log”
thì hơn :slight_smile:
Framework
Nó còn tuỳ thuộc vào việc bạn viết Framework dành cho việc gì, và độ phức tạp của Framework lớn đến đâu nữa Để viết một Framework phục vụ cho một trang web đơn giản thì có lẽ không có gì quá phức tạp, khi bạn chỉ cần nắm rõ những tư tưởng của mô hình MVC là đủ. Tuy nhiên để mà làm ra một Framework có tính ứng dụng trong các sản phẩm thực tế, ở mức enterprise thì đó lại là một chuyện khác, yêu cầu sự hiểu biết sâu sắc về PHP cũng như rất nhiều kiến về Design Patterns, Design Principles, Security ...
Những tài liệu từ cơ bản đến nâng cao về PHP bạn có thể tham khảo ở PHP The Right Way Về sách thì bạn có thể tìm đọc cuốn Modern PHP
Kiến thức cơ bản về Design Patterns, Design Principles bạn có thể tìm thấy qua nhiều bài viết trên Viblo, tuy nhiên để hiểu sâu về nó thì có lẽ cũng phải đọc sách
Còn để xây dựng một Framework tốt thì có lẽ cách nhanh nhất là đi tham khảo những Framework đã có hiện nay, xem chúng được viết nên như thế nào, có những điểm gì đặc biệt. Mình thì suggest bạn nên tham khảo code của Laravel Framework
Nếu bạn muốn có cái nhìn so sánh tổng quan về các Framework PHP phổ biến hiện nay, bạn có thể tham khảo một số bài sau: https://medium.com/level-up-web/best-php-frameworks-for-web-developers-in-2017-c8a041671a79 https://coderseye.com/best-php-frameworks-for-web-developers/
Làm sao test R.E.S.T
Nếu là Manual Test thì bạn có thể dùng Postman để gửi request. Nếu là viết Unit hay Integration Test thì tuỳ từng ngôn ngữ, từng framework sẽ có các packages hay libraries hỗ trợ việc test này. Không biết bạn ý bạn là test như thế nào và yêu cầu ra sao
[Laravel] test database - DatabaseMigrations 🆘
Đúng như bạn nói, việc dùng trait DatabaseMigrations
sẽ dẫn đến việc migrate và rollback sau mỗi test, và nó sẽ không phải là một ý hay khi mà bạn sử dụng CSDL như MySQL
.
Có một giải pháp đơn giản cho vấn đề này mà mình vẫn đang dùng đó là sử dụng một DB riêng biệt dành cho việc test, trước khi chạy test thì ta chạy migration và seeder nếu cần, và trong các class tests thì sử dụng DatabaseTransactions
thay vì DatabaseMigrations
. DatabaseTransactions
sẽ đơn giản là làm nhiệm vụ tạo ra transaction cho mỗi lần test, rồi rollback lại transaction khi mà test được thực hiện xong. Như vậy sẽ hiệu quả hơn nhiều
Laravel Learning Resources
Về kiến thức cơ bản, hầu hết bạn có thể tìm thấy trên Official Document của Laravel.
Trên Viblo cũng có rất nhiều bài viết về Laravel, bạn có thể follow tag Laravel để thường xuyên nhận được thông báo khi có bài viết mới.
Một số series về Laravel trên Viblo bạn nên đọc qua có thể kể đến như: Laravel Beauty, Kiến trúc hệ thống trên Laravel, Laravel và những điều cần biết ...
Về sách thì bạn có thể tham khảo một vài cuốn sau:
- Laravel 5 Essentials
- Learning Laravel's Eloquent
- Mastering Laravel
- Laravel Design Patterns and Best Practices
Tuy nhiên có 2 cuốn mà mình nghĩ có thể liệt vào hàng "sách gối đầu dường" dành cho những người học Laravel, đó là cuốn Laravel: From Apprentice To Artisan và Laravel Testing Decoded.
Laravel: From Apprentice To Artisan là cuốn sách của chính Taylor Otwell, cha đẻ của framework Laravel. Tuy rằng nó được viết từ khá lâu rồi, từ hồi còn là Laravel 4, nhưng những tư tưởng được viết trong đó vẫn còn đúng và có giá trị đến ngày hôm nay.
Laravel Testing Decoded là cuốn sách của JeffreyWay, người ta tạo ra trang Laracast, và có thể coi là người có ảnh hưởng đến cộng đồng Laravel lớn thứ 2 chỉ sau Taylor Otwell. Một ngày nào đó, khi bạn cần phải viết test cho project của mình thì đây sẽ là cuốn sách không thể bỏ qua.
Ngoài sách ra thì bạn cũng có thể xem những video podcast tại Laracast, chúng thực sự rất hữu ích, và bạn sẽ học hỏi được rất nhiều đấy.
Bạn có thể tham khảo thêm danh sách tài liệu, cũng như danh sách những thứ nên học, nên tham khảo tại https://github.com/wataridori/laravel-document
Cần tư vấn giải pháp MySQL lớn lên đến 10 triệu rows
Trước hết, bạn cần phải xác định được xem câu querry nào thực sự đã làm chậm quá trình load website của bạn. Bạn có thể thực hiện việc đó bằng cách bật chức năng log slow queries của Mysql lên:
# Enable slow query log
SET GLOBAL slow_query_log = 'ON';
# Chỉnh lại thời gian của query được nhận định là long query, mặc định là 10 giây
SET GLOBAL long_query_time = 1;
# Check xem slow query logs sẽ được lưu ở đâu
SELECT @@GLOBAL.slow_query_log_file;
# Bạn có thể thay đổi file mặc định này bằng cách
SET GLOBAL slow_query_log_file = '/path/to/filename';
Ngoài ra, bạn cũng nên bật cả log query để check xem có bao nhiêu query đã được thực hiện nữa
SET GLOBAL general_log = 'ON';
# Check xem query logs sẽ được lưu ở đâu
SELECT @@GLOBAL.general_log_file;
Sau đó hãy thử reload lại trang web để tìm ra nguyên nhân cho việc làm giảm performance service của mình nhé.
Một số nguyên nhân cơ bản có thể kể ra như:
- Gặp phải vấn đề về
n+1
query, dẫn đến lượng truy vấn database quá lớn - Sử dụng nhiều lệnh join phức tạp, cột dữ liệu cần truy vấn chưa được đánh index ...