How do facebook create cookies?
Bạn có thể nói rõ hơn là bạn muốn tìm hiểu về việc gì liên quan đến cookies của Facebook, và để sử dụng vào mục đích gì được không? Chứ với câu hỏi như hiện tại thì cũng không biết trả lời như thế nào cho ổn nữa
Trước tiên bạn cần hiểu rõ khái niệm về Cookie. Bạn có thể tham khảo một số bài về Cookie trên Viblo tại đây hoặc đây
Cookie là nơi để lưu những thông tin về state
của website ở phía trình duyệt. Để biết thông tin về cookie của một trang web, bạn có thể mở Chrome Console lên gõ document.cookie
, hoặc cài đặt một vài extension để xem và chỉnh sửa cookie dễ dàng, ví dụ như Edit This Cookie hay Cookie Inspector ...
Để lưu, chỉnh sửa cookie thì ta có thể thực hiện được cả ở phía server lẫn client.
(Chú ý là HttpOnly cookie
thì chỉ có thể được đọc và chỉnh sửa ở phía server)
Ở client, tức là dùng Javascript, bạn có thể tham khảo cách tạo và chỉnh sửa ở bài viết Tìm hiểu Cookie trong Javascript trên Viblo. Bạn có thể chỉnh sửa Cookie bằng cách dùng Javascript thuần, hoặc bằng Jquery, hay các thư viện Javascript khác.
Còn để lưu và chỉnh sửa cookie từ phía server thì còn tuỳ thuộc vào ngôn ngữ server side của bạn dùng là gì, framework mà bạn dùng là gì, mà nó sẽ có các cách khác nhau. Như Facebook, với việc dùng PHP, thì có thể họ sẽ dùng hàm setcookie
Toán tử =<<< là gì ?
Thực ra =<<<
không phải là một toán tử bạn ạ. =
là phép gán giá trị cho biến, còn <<<
là báo hiệu bắt đầu Heredoc trong PHP.
Theo cú pháp của Heredoc thì tiếp sau <<<
sẽ là một identifier báo hiệu bắt đầu của string, và nó cũng sẽ được dùng để báo hiệu kết thúc string.
Như bạn thấy thì ở ví dụ trên, identifier được sử dụng là CSS
(bạn có thể thay thế bằng đoạn text khác, nhưng nên nhớ lúc kết thúc cũng phải dùng đoạn text giống như thế)
Ở giữa identifier chính là string cần khởi tạo. Hay nói cách khác, đoạn code trên tương đương với:
$style =".new-note {\n font-weight: 700 !important;\n}";
$this->registerCss($style);
Heredoc thường được sử dụng với những documents (string) gồm nhiều dòng, nó sẽ giúp format code đẹp hơn. Ngoài ra bạn cũng có thể khai triển biến PHP bên trong Heredoc nữa.
Ẩ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 ...