[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"site-settings":3,"site-menu":10,"tag-laravel":21},{"siteName":4,"siteDescription":5,"contactEmail":6,"phone":7,"githubUrl":8,"facebookUrl":9},"vdhoangson.com","Ghi chép về lập trình, hệ thống và những điều học được trên đường làm sản phẩm.","contact@vdhoangson.com","+84 387 324 112","https:\u002F\u002Fgithub.com\u002Fvdhoangson","",{"items":11},[12,15,18],{"href":13,"label":14},"\u002F","Mới nhất",{"href":16,"label":17},"\u002Fcategory\u002Fdich-vu","Dịch vụ",{"href":19,"label":20},"\u002Fabout","Về tôi",{"items":22,"total":203,"page":204,"pageSize":205},[23,62,85,109,133,161,182],{"id":24,"wordpressId":25,"title":26,"slug":27,"excerpt":28,"contentHtml":29,"status":30,"authorName":31,"seoTitle":26,"seoDescription":28,"featuredMediaId":32,"featuredMedia":33,"categories":45,"tags":56,"publishedAt":60,"createdAt":60,"updatedAt":61},"dc2b66ed-ac04-4c59-be48-d87417fd8242",16379,"Laravel Model: create() và insert() có giống nhau?","laravel-model-create-va-insert-co-giong-nhau","Trong môn phái Laravel, có hai tuyệt kỹ khiến bao lập trình giả tranh luận không ngừng: create và insert. Nghe thì tưởng đồng môn, nhưng thực ra hai chiêu này đi hai con đường nội công khác biệt, dùng sai hoàn cảnh là tự đâm vào chân mình như chơi. Hôm nay, để tránh […]","\n\u003Cp class=\"wp-block-paragraph\">Trong môn phái Laravel, có hai tuyệt kỹ khiến bao lập trình giả tranh luận không ngừng: \u003Cstrong>create\u003C\u002Fstrong> và \u003Cstrong>insert\u003C\u002Fstrong>. Nghe thì tưởng đồng môn, nhưng thực ra hai chiêu này đi hai con đường nội công khác biệt, dùng sai hoàn cảnh là tự đâm vào chân mình như chơi.\u003C\u002Fp>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Hôm nay, để tránh huynh đệ tẩu hỏa nhập ma, ta sẽ mở cuộn tàn thư và giải thích cho rõ ràng.\u003C\u002Fp>\n\n\n\n\u003Ch1 class=\"wp-block-heading\">\u003Cstrong>1. Giang hồ đồn rằng create và insert giống nhau?\u003C\u002Fstrong>\u003C\u002Fh1>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Câu trả lời là \u003Cmark class=\"has-inline-color\">\u003Cstrong>KHÔNG, KHÔNG, KHÔNG\u003C\u002Fstrong>\u003C\u002Fmark> có nhưng.\u003C\u002Fp>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Cả hai đều có thể \u003Cstrong>thêm dữ liệu vào database\u003C\u002Fstrong>, nhưng bản chất nội công hoàn toàn khác nhau.\u003C\u002Fp>\n\n\n\n\u003Ch1 class=\"wp-block-heading\">\u003Cstrong>2. Tuyệt kỹ “create”: Một chiêu nội công thâm sâu của Eloquent\u003C\u002Fstrong>\u003C\u002Fh1>\n\n\n\n\u003Cblockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n\u003Cp class=\"wp-block-paragraph\">\u003Cem>“Một chiêu xuất ra, mang theo linh khí đất trời, tự động vận hành đủ thứ bí thuật.”\u003C\u002Fem>\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\n\n\n\u003Ch3 class=\"wp-block-heading\">✔ Đặc điểm:\u003C\u002Fh3>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>Tạo \u003Cstrong>một Eloquent Model instance\u003C\u002Fstrong>.\u003C\u002Fli>\n\n\n\n\u003Cli>Tự động chạy:\n\u003Cul class=\"wp-block-list\">\n\u003Cli>Mass Assignment check (fillable\u002Fguarded)\u003C\u002Fli>\n\n\n\n\u003Cli>Mutators (setXxxAttribute)\u003C\u002Fli>\n\n\n\n\u003Cli>Accessors khi load lại\u003C\u002Fli>\n\n\n\n\u003Cli>Casting\u003C\u002Fli>\n\n\n\n\u003Cli>Events: creating → created\u003C\u002Fli>\n\n\n\n\u003Cli>Timestamps: created_at \u002F updated_at\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\n\n\n\u003Cli>Trả về \u003Cstrong>model đầy đủ\u003C\u002Fstrong>, dùng tiếp mượt như lụa.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Ví dụ:\u003C\u002Fp>\n\n\n\n\u003Cpre class=\"wp-block-code\">\u003Ccode>User::create([\n   'name' =&gt; 'Lệnh Hồ Xung',\n   'email' =&gt; 'xung.lenh@vdhoangson.com',\n]);\u003C\u002Fcode>\u003C\u002Fpre>\n\n\n\n\u003Ch3 class=\"wp-block-heading\">📌 Khi nên dùng:\u003C\u002Fh3>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>Khi cần logic của model được kích hoạt.\u003C\u002Fli>\n\n\n\n\u003Cli>Khi muốn dùng tiếp model (ví dụ gửi event, xử lý quan hệ, truy cập property).\u003C\u002Fli>\n\n\n\n\u003Cli>Khi muốn code sạch, “chuẩn Eloquent”.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Ch3 class=\"wp-block-heading\">🧨 Nhược điểm:\u003C\u002Fh3>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>Chậm hơn \u003Cstrong>insert\u003C\u002Fstrong> vì chạy nhiều tầng nhiều lớp để thi triển nội công.\u003C\u002Fli>\n\n\n\n\u003Cli>Không phù hợp với \u003Cstrong>bulk insert số lượng lớn\u003C\u002Fstrong>.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Ch1 class=\"wp-block-heading\">\u003Cstrong>3. Tuyệt kỹ “insert”: Đao pháp nhanh, mạnh, gọn… nhưng vô tình vô nghĩa\u003C\u002Fstrong>\u003C\u002Fh1>\n\n\n\n\u003Cblockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n\u003Cp class=\"wp-block-paragraph\">\u003Cem>“Nhanh như gió, mạnh như bão, nhưng chẳng để lại chút linh lực nào.”\u003C\u002Fem>\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\n\n\n\u003Ch3 class=\"wp-block-heading\">✔ Đặc điểm:\u003C\u002Fh3>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>Gửi SQL \u003Cstrong>trực tiếp\u003C\u002Fstrong> xuống database.\u003C\u002Fli>\n\n\n\n\u003Cli>Không tạo model instance.\u003C\u002Fli>\n\n\n\n\u003Cli>Không chạy:\n\u003Cul class=\"wp-block-list\">\n\u003Cli>Events\u003C\u002Fli>\n\n\n\n\u003Cli>Mutators\u003C\u002Fli>\n\n\n\n\u003Cli>Casting\u003C\u002Fli>\n\n\n\n\u003Cli>Fillable\u003C\u002Fli>\n\n\n\n\u003Cli>Timestamps (nếu muốn phải tự thêm)\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\n\n\n\u003Cli>Trả về \u003Cstrong>bool\u003C\u002Fstrong>, không phải model.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Ví dụ:\u003C\u002Fp>\n\n\n\n\u003Cpre class=\"wp-block-code\">\u003Ccode>DB::table('users')-&gt;insert([\n   'name' =&gt; 'Đông Phương Bất Bại',\n   'email' =&gt; 'dong.phuong@vdhoangson.com',\n   'created_at' =&gt; now(),\n]);\u003C\u002Fcode>\u003C\u002Fpre>\n\n\n\n\u003Ch3 class=\"wp-block-heading\">📌 Khi nên dùng:\u003C\u002Fh3>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>Insert \u003Cstrong>nhiều dòng\u003C\u002Fstrong> cùng lúc (bulk insert).\u003C\u002Fli>\n\n\n\n\u003Cli>Không cần events, timestamps, mutators.\u003C\u002Fli>\n\n\n\n\u003Cli>Tối ưu tốc độ cho các tác vụ nặng.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Ch3 class=\"wp-block-heading\">⚡ Ưu điểm:\u003C\u002Fh3>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>Rất nhanh, nhanh hơn NYC lật mặt.\u003C\u002Fli>\n\n\n\n\u003Cli>Thích hợp cho queue, sync, seed dữ liệu lớn.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Ch3 class=\"wp-block-heading\">🧨 Nhược điểm:\u003C\u002Fh3>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>Không nhận model trả về.\u003C\u002Fli>\n\n\n\n\u003Cli>Không hưởng quyền lợi của Eloquent.\u003C\u002Fli>\n\n\n\n\u003Cli>Không có gì, không có gì cả.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Ch1 class=\"wp-block-heading\">🥋 \u003Cstrong>4. So găng: Create vs Insert\u003C\u002Fstrong>\u003C\u002Fh1>\n\n\n\n\u003Cfigure class=\"wp-block-table\">\u003Ctable class=\"has-fixed-layout\">\u003Cthead>\u003Ctr>\u003Cth>Tính năng\u003C\u002Fth>\u003Cth>create\u003C\u002Fth>\u003Cth>insert\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\u003Ctr>\u003Ctd>Tạo model instance\u003C\u002Ftd>\u003Ctd>✔\u003C\u002Ftd>\u003Ctd>❌\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>Chạy events\u003C\u002Ftd>\u003Ctd>✔\u003C\u002Ftd>\u003Ctd>❌\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>Chạy mutator\u002Faccessor\u003C\u002Ftd>\u003Ctd>✔\u003C\u002Ftd>\u003Ctd>❌\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>Tự động timestamps\u003C\u002Ftd>\u003Ctd>✔\u003C\u002Ftd>\u003Ctd>❌\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>Trả về model\u003C\u002Ftd>\u003Ctd>✔\u003C\u002Ftd>\u003Ctd>❌\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>Tốc độ\u003C\u002Ftd>\u003Ctd>Chậm hơn\u003C\u002Ftd>\u003Ctd>Nhanh hơn\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>Insert hàng loạt\u003C\u002Ftd>\u003Ctd>Không tối ưu\u003C\u002Ftd>\u003Ctd>Rất mạnh\u003C\u002Ftd>\u003C\u002Ftr>\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Ffigure>\n\n\n\n\u003Ch1 class=\"wp-block-heading\">\u003Cstrong>5. Kết luận bí pháp\u003C\u002Fstrong>\u003C\u002Fh1>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>Muốn “đúng chuẩn Eloquent”, cần sự tinh tế → \u003Cstrong>dùng create\u003C\u002Fstrong>.\u003C\u002Fli>\n\n\n\n\u003Cli>Muốn “xuất chiêu sấm sét”, tốc độ thần sầu → \u003Cstrong>dùng insert\u003C\u002Fstrong>.\u003C\u002Fli>\n\n\n\n\u003Cli>Mỗi tuyệt kỹ có chỗ phát huy riêng; cao thủ giang hồ là người biết dùng đúng lúc, đúng chỗ, đừng nên cố chấp.\u003C\u002Fli>\n\u003C\u002Ful>\n","published","vdhoangson@gmail.com","863c9fac-4c46-43f3-8f3b-a93d3c919f05",{"id":32,"wordpressId":34,"filename":35,"storageKey":36,"sourceUrl":37,"mimeType":38,"altText":9,"caption":39,"width":40,"height":41,"createdAt":42,"updatedAt":43,"url":44},16381,"laravel-create-vs-insert.png","wordpress\u002F2025\u002F11\u002Flaravel-create-vs-insert.png","https:\u002F\u002Fvdhoangson.com\u002Fwp-content\u002Fuploads\u002F2025\u002F11\u002Flaravel-create-vs-insert.png","image\u002Fpng",null,1536,1024,"2025-11-20T08:18:01.000Z","2026-10-15T04:59:31.204Z","\u002Fuploads\u002Fwordpress\u002F2025\u002F11\u002Flaravel-create-vs-insert.png",[46,52],{"id":47,"wordpressId":48,"name":49,"slug":50,"parentId":51},"5f89b685-533f-4c09-85fa-d018f8fd71a4",3,"Laravel","laravel","f6aff5ed-b85e-45e6-bbdb-08788be09d67",{"id":51,"wordpressId":53,"name":54,"slug":55,"parentId":39},2,"Lập Trình","lap-trinh",[57],{"id":58,"wordpressId":59,"name":50,"slug":50},"35b4e0f9-6caf-49f1-a08e-c5830e6d6f6d",11,"2025-11-20T08:19:52.000Z","2025-11-20T08:19:54.000Z",{"id":63,"wordpressId":64,"title":65,"slug":66,"excerpt":67,"contentHtml":68,"status":30,"authorName":31,"seoTitle":65,"seoDescription":67,"featuredMediaId":69,"featuredMedia":70,"categories":79,"tags":81,"publishedAt":83,"createdAt":83,"updatedAt":84},"93c528ab-2904-4a2f-83e6-ba71263d9b16",16348,"Laravel Lottery – Đem hên xui vào trong code","laravel-lottery-cong-cu-tao-xac-suat-ngau-nhien-trong-ung-dung","1. Mở đầu giang hồ? Laravel Lottery là một class nhỏ nhưng cực kỳ tiện lợi được thêm vào từ Laravel 10. Nó giúp bạn thực hiện các hành động theo xác suất, tức là cho phép một đoạn code chỉ chạy với tỉ lệ phần trăm nhất định — trước đây phải dùng mt_rand() […]","\n\u003Ch2 class=\"wp-block-heading\">1. Mở đầu giang hồ?\u003C\u002Fh2>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">\u003Cstrong>Laravel Lottery\u003C\u002Fstrong> là một class nhỏ nhưng cực kỳ tiện lợi được thêm vào từ \u003Cstrong>Laravel 10\u003C\u002Fstrong>. Nó giúp bạn thực hiện các hành động \u003Cem>theo xác suất\u003C\u002Fem>, tức là cho phép một đoạn code chỉ chạy \u003Cstrong>với tỉ lệ phần trăm nhất định\u003C\u002Fstrong> — trước đây phải dùng \u003Ccode>mt_rand()\u003C\u002Fcode> hay \u003Ccode>random_int()\u003C\u002Fcode> khá rườm rà, không có chút tuyệt kỹ nào.\u003C\u002Fp>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Ví dụ, các hạ có thể muốn:\u003C\u002Fp>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>Thỉnh thoảng log thêm thông tin debug.\u003C\u002Fli>\n\n\n\n\u003Cli>Chỉ gửi email thông báo cho \u003Cstrong>5% người dùng may mắn\u003C\u002Fstrong>.\u003C\u002Fli>\n\n\n\n\u003Cli>Giảm tải một job tốn tài nguyên bằng cách chỉ chạy ngẫu nhiên.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Nếu tại hạ viết:\u003C\u002Fp>\n\n\n\n\u003Cpre class=\"wp-block-code\">\u003Ccode>if (rand(1, 100) &lt;= 5) {\n\u002F\u002F Do something 5% of the time\n}\u003C\u002Fcode>\u003C\u002Fpre>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Ờ thì cũng được, nhưng trông \u003Cstrong>thiếu đạo hạnh\u003C\u002Fstrong>, khó test, khó đọc, và không “Laravel” chút nào\u003C\u002Fp>\n\n\n\n\u003Ch2 class=\"wp-block-heading\">2. \u003Cstrong>Bí kíp cơ bản\u003C\u002Fstrong>\u003C\u002Fh2>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Bộ pháp rất đơn giản:\u003C\u002Fp>\n\n\n\n\u003Cpre class=\"wp-block-code\">\u003Ccode>Lottery::odds($successes, $total)\n    -&gt;winner(function () {\n        \u002F\u002F Khi trúng \"xổ số\" 🎯\n    })\n    -&gt;loser(function () {\n        \u002F\u002F Khi trượt \"xổ số\" 😭\n    })\n    -&gt;choose();\n\u003C\u002Fcode>\u003C\u002Fpre>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Ví dụ:\u003C\u002Fp>\n\n\n\n\u003Cpre class=\"wp-block-code\">\u003Ccode>use Illuminate\\Support\\Lottery;\n\nLottery::odds(1, 10)\n    -&gt;winner(fn () =&gt; logger('Trúng 10% nè!'))\n    -&gt;loser(fn () =&gt; logger('Thua rồi...'))\n    -&gt;choose();\n\u003C\u002Fcode>\u003C\u002Fpre>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Câu trên nghĩa là: \u003Cstrong>có 10% cơ hội thực thi callback “winner”\u003C\u002Fstrong>.\u003Cbr \u002F>Laravel sẽ tự sinh “số phận” cho mỗi lần chạy.\u003C\u002Fp>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Nếu bạn muốn làm gì đó khi \u003Cem>không trúng\u003C\u002Fem>, có thể thêm \u003Ccode>loser()\u003C\u002Fcode>:\u003C\u002Fp>\n\n\n\n\u003Cpre class=\"wp-block-code\">\u003Ccode>Lottery::odds(1, 10)\n    -&gt;winner(fn () =&gt; info('🎉 Trúng rồi!'))\n    -&gt;loser(fn () =&gt; info('😅 Không trúng lần này.'));\n\u003C\u002Fcode>\u003C\u002Fpre>\n\n\n\n\u003Ch2 class=\"wp-block-heading\">3. \u003Cstrong>Vũ khí nâng cao\u003C\u002Fstrong>\u003C\u002Fh2>\n\n\n\n\u003Ch3 class=\"wp-block-heading\">1. Sử dụng \u003Ccode>Lottery::odds()\u003C\u002Fcode> với cú pháp tinh gọn\u003C\u002Fh3>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Nếu chỉ cần biết có “trúng” hay không:\u003C\u002Fp>\n\n\n\n\u003Cpre class=\"wp-block-code\">\u003Ccode>\nif (Lottery::odds(1, 50)-&gt;choose()) {\n    \u002F\u002F 1\u002F50 cơ hội\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Rất hợp cho các tác vụ kiểu “thỉnh thoảng làm”:\u003C\u002Fp>\n\n\n\n\u003Cpre class=\"wp-block-code\">\u003Ccode>if (Lottery::odds(1, 100)-&gt;choose()) {\n    Cache::flush(); \u002F\u002F Lâu lâu dọn cache cho vui\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\n\n\n\u003Ch3 class=\"wp-block-heading\">2. Tùy chỉnh seed\u003C\u002Fh3>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Để đảm bảo kết quả “giống nhau” trong một phiên test, có thể thiết lập seed:\u003C\u002Fp>\n\n\n\n\u003Cpre class=\"wp-block-code\">\u003Ccode>Lottery::odds(1, 10)-&gt;seed('example')-&gt;choose();\n\u003C\u002Fcode>\u003C\u002Fpre>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Cùng seed → cùng kết quả.\u003Cbr \u002F>Khác seed → vận mệnh đổi thay.\u003C\u002Fp>\n\n\n\n\u003Cblockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n\u003Cp class=\"wp-block-paragraph\">“Giang hồ có thể loạn, nhưng test phải ổn định.” 😆\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\n\n\n\u003Ch3 class=\"wp-block-heading\">3. Dùng trong ứng dụng thực chiến\u003C\u002Fh3>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Ví dụ trong \u003Cstrong>middleware\u003C\u002Fstrong>:\u003C\u002Fp>\n\n\n\n\u003Cpre class=\"wp-block-code\">\u003Ccode>public function handle($request, Closure $next)\n{\n   if (Lottery::odds(1, 1000)-&gt;choose()) {\n      logger('Sample request log');\n\n      return $next($request);\n   }\n}\u003C\u002Fcode>\u003C\u002Fpre>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Hoặc trong \u003Cstrong>job queue\u003C\u002Fstrong>:\u003C\u002Fp>\n\n\n\n\u003Cpre class=\"wp-block-code\">\u003Ccode>if (Lottery::odds(1, 20)-&gt;choose()) {\n   $this-&gt;sendReport();\n}\u003C\u002Fcode>\u003C\u002Fpre>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Hoặc \u003Cstrong>trong sự kiện marketing\u003C\u002Fstrong>:\u003C\u002Fp>\n\n\n\n\u003Cpre class=\"wp-block-code\">\u003Ccode>if (Lottery::odds(1, 100)-&gt;choose()) {\n        event(new LuckyUserRewarded($user));\n}\u003C\u002Fcode>\u003C\u002Fpre>\n\n\n\n\u003Ch2 class=\"wp-block-heading\">4. \u003Cstrong>Điểm mạnh và yếu của tuyệt học này\u003C\u002Fstrong>\u003C\u002Fh2>\n\n\n\n\u003Cfigure class=\"wp-block-table\">\u003Ctable class=\"has-fixed-layout\">\u003Cthead>\u003Ctr>\u003Cth>Thuộc tính\u003C\u002Fth>\u003Cth>Ưu điểm\u003C\u002Fth>\u003Cth>Nhược điểm\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\u003Ctr>\u003Ctd>\u003Cstrong>Cú pháp\u003C\u002Fstrong>\u003C\u002Ftd>\u003Ctd>Dễ đọc, rõ nghĩa, “chuẩn Laravel”\u003C\u002Ftd>\u003Ctd>Hơi dư nếu chỉ cần random đơn giản\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>\u003Cstrong>Ứng dụng\u003C\u002Fstrong>\u003C\u002Ftd>\u003Ctd>Tuyệt vời cho logging, sampling, thử nghiệm A\u002FB\u003C\u002Ftd>\u003Ctd>Không phù hợp cho game hoặc xác suất chính xác tuyệt đối\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>\u003Cstrong>Test &amp; debug\u003C\u002Fstrong>\u003C\u002Ftd>\u003Ctd>Có thể seed để tái tạo kết quả\u003C\u002Ftd>\u003Ctd>Nếu quên seed, test có thể không ổn định\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>\u003Cstrong>Tích hợp\u003C\u002Fstrong>\u003C\u002Ftd>\u003Ctd>Dễ dùng trong middleware, jobs, events\u003C\u002Ftd>\u003Ctd>Không lưu trạng thái – hoàn toàn ngẫu nhiên mỗi lần gọi\u003C\u002Ftd>\u003C\u002Ftr>\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Ffigure>\n\n\n\n\u003Ch2 class=\"wp-block-heading\">\u003Cstrong>Tổng kết giang hồ\u003C\u002Fstrong>\u003C\u002Fh2>\n\n\n\n\u003Cblockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n\u003Cp class=\"wp-block-paragraph\">“Code mà không có random thì như trà mà không có đá – nhạt lắm!”\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Laravel Lottery tuy nhỏ, nhưng cực kỳ hữu ích khi ta biết cách đặt nó đúng chỗ.\u003Cbr \u002F>Nó giúp code vừa tinh gọn, vừa dễ đọc, vừa có linh hồn “may rủi” rất tự nhiên.\u003C\u002Fp>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Còn nếu anh em đang viết hệ thống có tỷ lệ, sampling, logging —\u003Cbr \u002F>hãy thử vận nội công với câu thần chú:\u003C\u002Fp>\n\n\n\n\u003Cpre class=\"wp-block-code\">\u003Ccode>Lottery::alwaysWin();\nLottery::alwaysLose();\n\u003C\u002Fcode>\u003C\u002Fpre>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Điều này rất hữu ích trong unit test, giúp bạn kiểm soát logic mà không phải dựa vào may rủi.\u003C\u002Fp>\n","c172673a-2be1-41d6-9d58-b5ed756676f0",{"id":69,"wordpressId":71,"filename":72,"storageKey":73,"sourceUrl":74,"mimeType":38,"altText":9,"caption":39,"width":75,"height":76,"createdAt":77,"updatedAt":43,"url":78},16349,"laravel-lottery.png","wordpress\u002F2025\u002F10\u002Flaravel-lottery.png","https:\u002F\u002Fvdhoangson.com\u002Fwp-content\u002Fuploads\u002F2025\u002F10\u002Flaravel-lottery.png",1050,700,"2025-10-23T08:35:18.000Z","\u002Fuploads\u002Fwordpress\u002F2025\u002F10\u002Flaravel-lottery.png",[80],{"id":47,"wordpressId":48,"name":49,"slug":50,"parentId":51},[82],{"id":58,"wordpressId":59,"name":50,"slug":50},"2025-10-23T08:36:26.000Z","2025-11-09T12:59:12.000Z",{"id":86,"wordpressId":87,"title":88,"slug":89,"excerpt":90,"contentHtml":91,"status":30,"authorName":31,"seoTitle":88,"seoDescription":90,"featuredMediaId":92,"featuredMedia":93,"categories":103,"tags":105,"publishedAt":107,"createdAt":107,"updatedAt":108},"412a547f-adb6-4abe-a967-46bd3cff4e59",166,"Laravel Cache – Phân biệt put, set, remember, forever, và add","laravel-cache-phan-biet-put-set-remember-forever-va-add","Caching trong Laravel là một trong những tính năng mạnh mẽ nhất giúp tăng hiệu suất ứng dụng, giảm tải database và tăng tốc độ phản hồi. Tuy nhiên, nhiều dev hay bị nhầm lẫn giữa các method như put, set, remember, forever, hay add. Bài này sẽ phân tích chi tiết sự khác nhau […]","\n\u003Cp class=\"wp-block-paragraph\">Caching trong Laravel là một trong những tính năng mạnh mẽ nhất giúp tăng hiệu suất ứng dụng, giảm tải database và tăng tốc độ phản hồi. Tuy nhiên, nhiều dev hay bị nhầm lẫn giữa các method như \u003Ccode>put\u003C\u002Fcode>, \u003Ccode>set\u003C\u002Fcode>, \u003Ccode>remember\u003C\u002Fcode>, \u003Ccode>forever\u003C\u002Fcode>, hay \u003Ccode>add\u003C\u002Fcode>. Bài này sẽ phân tích chi tiết sự khác nhau và khi nào nên dùng từng cái.\u003C\u002Fp>\n\n\n\n\u003Chr class=\"wp-block-separator has-alpha-channel-opacity\" \u002F>\n\n\n\n\u003Ch2 class=\"wp-block-heading\">1. \u003Ccode>put()\u003C\u002Fcode> và \u003Ccode>set()\u003C\u002Fcode>\u003C\u002Fh2>\n\n\n\n\u003Ch3 class=\"wp-block-heading\">\u003Ccode>put()\u003C\u002Fcode>\u003C\u002Fh3>\n\n\n\n\u003Cpre class=\"wp-block-code\">\u003Ccode>Cache::put('username', 'sonvo', 3600);\n\u003C\u002Fcode>\u003C\u002Fpre>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>Lưu giá trị vào cache với key \u003Ccode>username\u003C\u002Fcode>.\u003C\u002Fli>\n\n\n\n\u003Cli>Thời gian sống (TTL) là 3600 giây (1 giờ).\u003C\u002Fli>\n\n\n\n\u003Cli>Nếu key đã tồn tại → ghi đè.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Ch3 class=\"wp-block-heading\">\u003Ccode>set()\u003C\u002Fcode>\u003C\u002Fh3>\n\n\n\n\u003Cpre class=\"wp-block-code\">\u003Ccode>Cache::set('username', 'sonvo', 3600);\n\u003C\u002Fcode>\u003C\u002Fpre>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>Thực chất giống \u003Cstrong>hệt\u003C\u002Fstrong> \u003Ccode>put()\u003C\u002Fcode>.\u003C\u002Fli>\n\n\n\n\u003Cli>Được thêm vào để tuân thủ \u003Cstrong>PSR-16 (Simple Cache Standard)\u003C\u002Fstrong>.\u003C\u002Fli>\n\n\n\n\u003Cli>Nếu bạn muốn code mang tính chuẩn, portable giữa các framework\u002Flib khác → dùng \u003Ccode>set()\u003C\u002Fcode>.\u003C\u002Fli>\n\n\n\n\u003Cli>Nếu code thuần Laravel → \u003Ccode>put()\u003C\u002Fcode> và \u003Ccode>set()\u003C\u002Fcode> như nhau.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">✅ \u003Cstrong>Khi dùng:\u003C\u002Fstrong> muốn lưu cache có thời gian hết hạn.\u003C\u002Fp>\n\n\n\n\u003Chr class=\"wp-block-separator has-alpha-channel-opacity\" \u002F>\n\n\n\n\u003Ch2 class=\"wp-block-heading\">2. \u003Ccode>remember()\u003C\u002Fcode>\u003C\u002Fh2>\n\n\n\n\u003Cpre class=\"wp-block-code\">\u003Ccode>Cache::remember('user:1', 3600, function () {\n    return User::find(1);\n});\n\u003C\u002Fcode>\u003C\u002Fpre>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>Nếu key \u003Ccode>user:1\u003C\u002Fcode> \u003Cstrong>chưa có trong cache\u003C\u002Fstrong> → chạy callback (query DB), lưu vào cache trong 3600 giây, rồi trả về.\u003C\u002Fli>\n\n\n\n\u003Cli>Nếu key đã có → lấy luôn từ cache.\u003C\u002Fli>\n\n\n\n\u003Cli>Giúp tránh code lặp kiểu: \u003Ccode>if (Cache::has('user:1')) { return Cache::get('user:1'); } else { $user = User::find(1); Cache::put('user:1', $user, 3600); return $user; }\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">✅ \u003Cstrong>Khi dùng:\u003C\u002Fstrong> muốn cache dữ liệu tốn chi phí lấy (DB query, API call) và tự động lấy lại nếu chưa có.\u003C\u002Fp>\n\n\n\n\u003Chr class=\"wp-block-separator has-alpha-channel-opacity\" \u002F>\n\n\n\n\u003Ch2 class=\"wp-block-heading\">3. \u003Ccode>forever()\u003C\u002Fcode>\u003C\u002Fh2>\n\n\n\n\u003Cpre class=\"wp-block-code\">\u003Ccode>Cache::forever('site_name', 'MiniApp');\n\u003C\u002Fcode>\u003C\u002Fpre>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>Lưu cache \u003Cstrong>vĩnh viễn\u003C\u002Fstrong> (cho đến khi bị xoá bằng \u003Ccode>forget()\u003C\u002Fcode> hoặc \u003Ccode>flush()\u003C\u002Fcode>).\u003C\u002Fli>\n\n\n\n\u003Cli>Không có TTL (time-to-live).\u003C\u002Fli>\n\n\n\n\u003Cli>Lưu ý: “vĩnh viễn” ở đây phụ thuộc vào driver. Ví dụ:\n\u003Cul class=\"wp-block-list\">\n\u003Cli>File \u002F Redis \u002F Database → giữ mãi cho đến khi xóa.\u003C\u002Fli>\n\n\n\n\u003Cli>APCu \u002F Memcached → vẫn có thể mất nếu server restart.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">✅ \u003Cstrong>Khi dùng:\u003C\u002Fstrong> dữ liệu ít thay đổi, quan trọng, và muốn giữ lâu dài (ví dụ: config tĩnh).\u003C\u002Fp>\n\n\n\n\u003Chr class=\"wp-block-separator has-alpha-channel-opacity\" \u002F>\n\n\n\n\u003Ch2 class=\"wp-block-heading\">4. \u003Ccode>add()\u003C\u002Fcode>\u003C\u002Fh2>\n\n\n\n\u003Cpre class=\"wp-block-code\">\u003Ccode>Cache::add('token', 'ABC123', 600);\n\u003C\u002Fcode>\u003C\u002Fpre>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>Chỉ thêm vào cache nếu key \u003Cstrong>chưa tồn tại\u003C\u002Fstrong>.\u003C\u002Fli>\n\n\n\n\u003Cli>Nếu key đã tồn tại → \u003Cstrong>bỏ qua\u003C\u002Fstrong> (không ghi đè).\u003C\u002Fli>\n\n\n\n\u003Cli>Trả về \u003Ccode>true\u003C\u002Fcode> nếu thêm thành công, \u003Ccode>false\u003C\u002Fcode> nếu thất bại.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">✅ \u003Cstrong>Khi dùng:\u003C\u002Fstrong> lưu token, session, hoặc dữ liệu chỉ nên được set một lần và không được ghi đè.\u003C\u002Fp>\n\n\n\n\u003Chr class=\"wp-block-separator has-alpha-channel-opacity\" \u002F>\n\n\n\n\u003Ch2 class=\"wp-block-heading\">🔍 So sánh nhanh\u003C\u002Fh2>\n\n\n\n\u003Cfigure class=\"wp-block-table\">\u003Ctable class=\"has-fixed-layout\">\u003Cthead>\u003Ctr>\u003Cth>Method\u003C\u002Fth>\u003Cth>Ghi đè key cũ?\u003C\u002Fth>\u003Cth>Có TTL không?\u003C\u002Fth>\u003Cth>Callback hỗ trợ?\u003C\u002Fth>\u003Cth>Ghi chú\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\u003Ctr>\u003Ctd>\u003Ccode>put\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd>✅ Có\u003C\u002Ftd>\u003Ctd>✅ Có\u003C\u002Ftd>\u003Ctd>❌ Không\u003C\u002Ftd>\u003Ctd>Chuẩn Laravel\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>\u003Ccode>set\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd>✅ Có\u003C\u002Ftd>\u003Ctd>✅ Có\u003C\u002Ftd>\u003Ctd>❌ Không\u003C\u002Ftd>\u003Ctd>Alias theo PSR-16\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>\u003Ccode>remember\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd>✅ Có\u003C\u002Ftd>\u003Ctd>✅ Có\u003C\u002Ftd>\u003Ctd>✅ Có\u003C\u002Ftd>\u003Ctd>Tự động query\u002Fcache\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>\u003Ccode>forever\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd>✅ Có\u003C\u002Ftd>\u003Ctd>❌ Không\u003C\u002Ftd>\u003Ctd>❌ Không\u003C\u002Ftd>\u003Ctd>Cache vĩnh viễn\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>\u003Ccode>add\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd>❌ Không\u003C\u002Ftd>\u003Ctd>✅ Có\u003C\u002Ftd>\u003Ctd>❌ Không\u003C\u002Ftd>\u003Ctd>Chỉ set nếu chưa có\u003C\u002Ftd>\u003C\u002Ftr>\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Ffigure>\n\n\n\n\u003Chr class=\"wp-block-separator has-alpha-channel-opacity\" \u002F>\n\n\n\n\u003Ch2 class=\"wp-block-heading\">🚀 Kết luận\u003C\u002Fh2>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>\u003Cstrong>\u003Ccode>put\u003C\u002Fcode> \u002F \u003Ccode>set\u003C\u002Fcode>\u003C\u002Fstrong>: lưu cache tạm thời (có TTL).\u003C\u002Fli>\n\n\n\n\u003Cli>\u003Cstrong>\u003Ccode>remember\u003C\u002Fcode>\u003C\u002Fstrong>: thông minh hơn, chỉ query khi cần.\u003C\u002Fli>\n\n\n\n\u003Cli>\u003Cstrong>\u003Ccode>forever\u003C\u002Fcode>\u003C\u002Fstrong>: dữ liệu vĩnh viễn.\u003C\u002Fli>\n\n\n\n\u003Cli>\u003Cstrong>\u003Ccode>add\u003C\u002Fcode>\u003C\u002Fstrong>: chỉ lưu khi chưa tồn tại.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">👉 Khi code thực tế:\u003C\u002Fp>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>Dữ liệu thay đổi thường xuyên → \u003Ccode>put\u003C\u002Fcode> hoặc \u003Ccode>set\u003C\u002Fcode>.\u003C\u002Fli>\n\n\n\n\u003Cli>Dữ liệu cần tránh query nhiều lần → \u003Ccode>remember\u003C\u002Fcode>.\u003C\u002Fli>\n\n\n\n\u003Cli>Dữ liệu config\u002Ftĩnh → \u003Ccode>forever\u003C\u002Fcode>.\u003C\u002Fli>\n\n\n\n\u003Cli>Trường hợp tránh ghi đè → \u003Ccode>add\u003C\u002Fcode>.\u003C\u002Fli>\n\u003C\u002Ful>\n","a306442c-6e50-4776-83a2-c5127e5e933e",{"id":92,"wordpressId":94,"filename":95,"storageKey":96,"sourceUrl":97,"mimeType":98,"altText":9,"caption":39,"width":99,"height":100,"createdAt":101,"updatedAt":43,"url":102},16253,"laravel-cache.jpg","wordpress\u002F2025\u002F07\u002Flaravel-cache.jpg","https:\u002F\u002Fvdhoangson.com\u002Fwp-content\u002Fuploads\u002F2025\u002F07\u002Flaravel-cache.jpg","image\u002Fjpeg",1600,900,"2025-09-18T14:17:45.000Z","\u002Fuploads\u002Fwordpress\u002F2025\u002F07\u002Flaravel-cache.jpg",[104],{"id":47,"wordpressId":48,"name":49,"slug":50,"parentId":51},[106],{"id":58,"wordpressId":59,"name":50,"slug":50},"2025-07-07T02:57:04.000Z","2025-09-18T14:52:51.000Z",{"id":110,"wordpressId":111,"title":112,"slug":113,"excerpt":114,"contentHtml":115,"status":30,"authorName":31,"seoTitle":112,"seoDescription":114,"featuredMediaId":116,"featuredMedia":117,"categories":126,"tags":129,"publishedAt":131,"createdAt":131,"updatedAt":132},"0e29fb3a-dd03-4693-8283-0ab68e483c2e",164,"Laravel: Chạy Job bất đồng bộ hay đồng bộ?","laravel-chay-job-bat-dong-bo-hay-dong-bo","Khi làm việc với Laravel Queue, chắc hẳn bạn đã từng gặp hai phương thức quen thuộc: Nghe thì na ná nhau, nhưng thực ra cách hoạt động lại khác biệt hoàn toàn. Hiểu đúng sự khác nhau sẽ giúp bạn tối ưu hiệu năng và tránh bug ngớ ngẩn khi xử lý job. 1. […]","\n\u003Cp class=\"wp-block-paragraph\">Khi làm việc với \u003Cstrong>Laravel Queue\u003C\u002Fstrong>, chắc hẳn bạn đã từng gặp hai phương thức quen thuộc:\u003C\u002Fp>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>\u003Ccode>dispatch()\u003C\u002Fcode>\u003C\u002Fli>\n\n\n\n\u003Cli>\u003Ccode>dispatch_sync()\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Nghe thì na ná nhau, nhưng thực ra cách hoạt động lại khác biệt hoàn toàn. Hiểu đúng sự khác nhau sẽ giúp bạn \u003Cstrong>tối ưu hiệu năng\u003C\u002Fstrong> và \u003Cstrong>tránh bug ngớ ngẩn\u003C\u002Fstrong> khi xử lý job.\u003C\u002Fp>\n\n\n\n\u003Chr class=\"wp-block-separator has-alpha-channel-opacity\" \u002F>\n\n\n\n\u003Ch2 class=\"wp-block-heading\">1. \u003Ccode>dispatch()\u003C\u002Fcode>: Gửi Job vào hàng đợi\u003C\u002Fh2>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">\u003Ccode>dispatch()\u003C\u002Fcode> dùng để đưa Job vào hàng đợi (queue). Worker sẽ xử lý nó sau, theo cơ chế bất đồng bộ.\u003C\u002Fp>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Ví dụ:\u003C\u002Fp>\n\n\n\n\u003Cpre class=\"wp-block-code\">\u003Ccode>SendWelcomeEmail::dispatch($user);\n\u003C\u002Fcode>\u003C\u002Fpre>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Khi chạy code trên:\u003C\u002Fp>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>Job \u003Ccode>SendWelcomeEmail\u003C\u002Fcode> \u003Cstrong>không chạy ngay\u003C\u002Fstrong>.\u003C\u002Fli>\n\n\n\n\u003Cli>Nó sẽ được lưu vào queue (Redis, Database, SQS, RabbitMQ…).\u003C\u002Fli>\n\n\n\n\u003Cli>Worker (chạy bằng lệnh \u003Ccode>php artisan queue:work\u003C\u002Fcode>) sẽ pick nó lên và xử lý.\u003C\u002Fli>\n\n\n\n\u003Cli>Request hiện tại \u003Cstrong>không bị chặn\u003C\u002Fstrong>, trả về ngay cho user → nhanh và mượt.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">👉 Thích hợp cho:\u003C\u002Fp>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>Gửi email, SMS.\u003C\u002Fli>\n\n\n\n\u003Cli>Xử lý file, video, ảnh.\u003C\u002Fli>\n\n\n\n\u003Cli>Đồng bộ dữ liệu với service khác.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Chr class=\"wp-block-separator has-alpha-channel-opacity\" \u002F>\n\n\n\n\u003Ch2 class=\"wp-block-heading\">2. \u003Ccode>dispatch_sync()\u003C\u002Fcode>: Chạy ngay lập tức\u003C\u002Fh2>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Ngược lại, \u003Ccode>dispatch_sync()\u003C\u002Fcode> sẽ bỏ qua queue và chạy Job \u003Cstrong>ngay trong tiến trình hiện tại\u003C\u002Fstrong>.\u003C\u002Fp>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Ví dụ:\u003C\u002Fp>\n\n\n\n\u003Cpre class=\"wp-block-code\">\u003Ccode>WriteAuditLog::dispatchSync($user);\n\u003C\u002Fcode>\u003C\u002Fpre>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Khi chạy code trên:\u003C\u002Fp>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>Job \u003Ccode>WriteAuditLog\u003C\u002Fcode> \u003Cstrong>thực thi ngay\u003C\u002Fstrong>.\u003C\u002Fli>\n\n\n\n\u003Cli>Không cần worker, không cần queue.\u003C\u002Fli>\n\n\n\n\u003Cli>Request sẽ \u003Cstrong>chờ job chạy xong\u003C\u002Fstrong> mới tiếp tục.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">👉 Thích hợp cho:\u003C\u002Fp>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>Ghi log quan trọng.\u003C\u002Fli>\n\n\n\n\u003Cli>Tính toán cần kết quả ngay.\u003C\u002Fli>\n\n\n\n\u003Cli>Các tác vụ nhỏ, không tốn nhiều thời gian.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Chr class=\"wp-block-separator has-alpha-channel-opacity\" \u002F>\n\n\n\n\u003Ch2 class=\"wp-block-heading\">3. Khi nào dùng cái nào?\u003C\u002Fh2>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>\u003Cstrong>Dùng \u003Ccode>dispatch()\u003C\u002Fcode>\u003C\u002Fstrong> khi:\n\u003Cul class=\"wp-block-list\">\n\u003Cli>Tác vụ nặng.\u003C\u002Fli>\n\n\n\n\u003Cli>Không cần kết quả ngay.\u003C\u002Fli>\n\n\n\n\u003Cli>Bạn muốn tăng tốc request trả về cho user.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\n\n\n\u003Cli>\u003Cstrong>Dùng \u003Ccode>dispatch_sync()\u003C\u002Fcode>\u003C\u002Fstrong> khi:\n\u003Cul class=\"wp-block-list\">\n\u003Cli>Tác vụ nhỏ, cần chạy ngay.\u003C\u002Fli>\n\n\n\n\u003Cli>Muốn đảm bảo chạy xong trước khi qua bước tiếp theo.\u003C\u002Fli>\n\n\n\n\u003Cli>Không muốn phụ thuộc vào queue worker.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Chr class=\"wp-block-separator has-alpha-channel-opacity\" \u002F>\n\n\n\n\u003Ch2 class=\"wp-block-heading\">4. Lưu ý\u003C\u002Fh2>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>Trước Laravel 8 có \u003Ccode>dispatchNow()\u003C\u002Fcode>, nhưng đã bị thay thế bởi \u003Ccode>dispatchSync()\u003C\u002Fcode>.\u003C\u002Fli>\n\n\n\n\u003Cli>Nếu bạn dùng \u003Ccode>dispatch()\u003C\u002Fcode> mà không bật queue worker, job sẽ \u003Cstrong>không bao giờ chạy\u003C\u002Fstrong> → bug silent rất khó chịu.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Chr class=\"wp-block-separator has-alpha-channel-opacity\" \u002F>\n\n\n\n\u003Ch2 class=\"wp-block-heading\">5. Kết luận\u003C\u002Fh2>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>\u003Ccode>dispatch()\u003C\u002Fcode> = chạy bất đồng bộ (qua queue).\u003C\u002Fli>\n\n\n\n\u003Cli>\u003Ccode>dispatch_sync()\u003C\u002Fcode> = chạy đồng bộ, ngay lập tức.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">👉 Hãy nhớ:\u003C\u002Fp>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>\u003Cstrong>Nặng → dispatch.\u003C\u002Fstrong>\u003C\u002Fli>\n\n\n\n\u003Cli>\u003Cstrong>Nhẹ &amp; cần ngay → dispatch_sync.\u003C\u002Fstrong>\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Đơn giản vậy thôi, nhưng áp dụng đúng thì hệ thống Laravel của bạn vừa \u003Cstrong>nhanh hơn\u003C\u002Fstrong>, vừa \u003Cstrong>ổn định hơn\u003C\u002Fstrong>.\u003C\u002Fp>\n","f19724a6-8553-4d5c-930e-58b1fcf1b2ab",{"id":116,"wordpressId":118,"filename":119,"storageKey":120,"sourceUrl":121,"mimeType":38,"altText":9,"caption":39,"width":122,"height":123,"createdAt":124,"updatedAt":43,"url":125},16256,"laravel.png","wordpress\u002F2025\u002F07\u002Flaravel.png","https:\u002F\u002Fvdhoangson.com\u002Fwp-content\u002Fuploads\u002F2025\u002F07\u002Flaravel.png",1930,1090,"2025-09-26T08:50:47.000Z","\u002Fuploads\u002Fwordpress\u002F2025\u002F07\u002Flaravel.png",[127,128],{"id":51,"wordpressId":53,"name":54,"slug":55,"parentId":39},{"id":47,"wordpressId":48,"name":49,"slug":50,"parentId":51},[130],{"id":58,"wordpressId":59,"name":50,"slug":50},"2025-07-07T02:57:03.000Z","2025-09-26T08:52:03.000Z",{"id":134,"wordpressId":135,"title":136,"slug":137,"excerpt":138,"contentHtml":139,"status":30,"authorName":31,"seoTitle":136,"seoDescription":138,"featuredMediaId":140,"featuredMedia":141,"categories":150,"tags":157,"publishedAt":159,"createdAt":159,"updatedAt":160},"18a01359-e7c1-493e-8874-395c9f637ef4",1991,"Filament đã chạy “native” trên Android!","filament-da-chay-native-tren-android","Filament – bộ admin panel bóng bẩy, mạnh mẽ mà bạn từng dùng trong trình duyệt – giờ đã chạy ngon lành trong app Android thật sự, offline không cần mạng, và tất nhiên là powered by… Laravel + PHP! 👊 Cộng đồng Laravel quá bá đạo Từ khi ra mắt NativePHP for Mobile, hàng […]","\n\u003Cp class=\"wp-block-paragraph\">\u003Cstrong>Filament\u003C\u002Fstrong> – bộ admin panel bóng bẩy, mạnh mẽ mà bạn từng dùng trong trình duyệt – giờ \u003Cstrong>đã chạy ngon lành trong app Android thật sự\u003C\u002Fstrong>, offline không cần mạng, và tất nhiên là powered by… Laravel + PHP!\u003C\u002Fp>\n\n\n\n\u003Ch2 class=\"wp-block-heading\">👊 Cộng đồng Laravel quá bá đạo\u003C\u002Fh2>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Từ khi ra mắt \u003Cstrong>NativePHP for Mobile\u003C\u002Fstrong>, hàng ngàn dev Laravel đã đứng lên nói:\u003C\u002Fp>\n\n\n\n\u003Cblockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n\u003Cp class=\"wp-block-paragraph\">“Tôi muốn làm app native bằng chính ngôn ngữ lập trình tôi đã biết!”\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Và nhờ đó:\u003C\u002Fp>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>✅ Hỗ trợ Android (sau iOS)\u003C\u002Fli>\n\n\n\n\u003Cli>✅ Có hot reload (khỏi rebuild mỗi lần sửa)\u003C\u002Fli>\n\n\n\n\u003Cli>✅ Đang làm OTA update, phân phối build, Zephpyr v.v.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Đặc biệt: đã xử lý xong cục xương khó nhất – \u003Cstrong>hỗ trợ intl extension\u003C\u002Fstrong> (mấu chốt để format số, tiền, ngày… đúng chuẩn quốc tế).\u003C\u002Fp>\n\n\n\n\u003Chr class=\"wp-block-separator has-alpha-channel-opacity\" \u002F>\n\n\n\n\u003Ch2 class=\"wp-block-heading\">🧠 Thách thức intl trên Android\u003C\u002Fh2>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Bình thường \u003Ccode>intl\u003C\u002Fcode> chạy phía server. Nhưng đưa nó vào Android? Hơi bị khoai!\u003C\u002Fp>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Phải:\u003C\u002Fp>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>Build lại ICU (bộ xử lý định dạng quốc tế)\u003C\u002Fli>\n\n\n\n\u003Cli>Tùy chỉnh để tương thích với Android\u003C\u002Fli>\n\n\n\n\u003Cli>Test, fail, debug liên tục\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Nhưng giờ… \u003Cstrong>nó hoạt động mượt như mơ\u003C\u002Fstrong>.\u003C\u002Fp>\n\n\n\n\u003Chr class=\"wp-block-separator has-alpha-channel-opacity\" \u002F>\n\n\n\n\u003Ch2 class=\"wp-block-heading\">🎁 Đổi lại 30MB là trải nghiệm xịn xò\u003C\u002Fh2>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Chấp nhận tăng ~30MB app size, bạn có được:\u003C\u002Fp>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>🌍 Format số, tiền, ngày đúng locale\u003C\u002Fli>\n\n\n\n\u003Cli>⚙️ Dùng mọi component phức tạp của Filament\u003C\u002Fli>\n\n\n\n\u003Cli>📦 Tương thích nhiều package Laravel hơn\u003C\u002Fli>\n\n\n\n\u003Cli>🚫 Và không cần server! Offline 100%\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Chr class=\"wp-block-separator has-alpha-channel-opacity\" \u002F>\n\n\n\n\u003Ch2 class=\"wp-block-heading\">🔮 Tiếp theo: iOS &amp; nhiều điều thú vị\u003C\u002Fh2>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Team đang:\u003C\u002Fp>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>Xây \u003Cstrong>Zephpyr\u003C\u002Fstrong> – hệ thống build và phân phối\u003C\u002Fli>\n\n\n\n\u003Cli>Tối ưu app nhẹ hơn nếu không cần intl\u003C\u002Fli>\n\n\n\n\u003Cli>Mở rộng hỗ trợ package Laravel\u003C\u002Fli>\n\n\n\n\u003Cli>Tăng cường CLI cho quản lý thiết bị\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Chr class=\"wp-block-separator has-alpha-channel-opacity\" \u002F>\n\n\n\n\u003Ch2 class=\"wp-block-heading\">🧡 Laravel không chỉ là web nữa!\u003C\u002Fh2>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Filament chạy native là cột mốc lịch sử.\u003Cbr \u002F>Laravel dev giờ không chỉ là web dev.\u003Cbr \u002F>Bạn có thể làm app mobile “xịn” mà không rời PHP!\u003C\u002Fp>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Cộng đồng chính là điều làm nên kỳ tích này.\u003Cbr \u002F>Giờ thì… \u003Cstrong>hãy đi tạo nên điều tuyệt vời tiếp theo!\u003C\u002Fstrong> 💪\u003C\u002Fp>\n","2c992a70-8162-4353-89e6-31b44bdb3053",{"id":140,"wordpressId":142,"filename":143,"storageKey":144,"sourceUrl":145,"mimeType":38,"altText":9,"caption":39,"width":146,"height":147,"createdAt":148,"updatedAt":43,"url":149},1992,"nativephp-filament2.png","wordpress\u002F2025\u002F06\u002Fnativephp-filament2.png","https:\u002F\u002Fvdhoangson.com\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002Fnativephp-filament2.png",2200,1100,"2025-06-24T08:25:13.000Z","\u002Fuploads\u002Fwordpress\u002F2025\u002F06\u002Fnativephp-filament2.png",[151,152],{"id":47,"wordpressId":48,"name":49,"slug":50,"parentId":51},{"id":153,"wordpressId":154,"name":155,"slug":156,"parentId":51},"56268c91-7b68-4ce5-9576-25ed0595bbac",20,"PHP","php",[158],{"id":58,"wordpressId":59,"name":50,"slug":50},"2025-06-24T08:27:38.000Z","2025-06-24T08:27:40.000Z",{"id":162,"wordpressId":163,"title":164,"slug":165,"excerpt":166,"contentHtml":167,"status":30,"authorName":31,"seoTitle":164,"seoDescription":166,"featuredMediaId":168,"featuredMedia":169,"categories":176,"tags":178,"publishedAt":180,"createdAt":180,"updatedAt":181},"33debf8d-2898-4fba-a5dd-44e53bf3fa93",1975,"So sánh auth check và auth hasUser trong Laravel","so-sanh-auth-check-va-auth-hasuser-trong-laravel","Laravel là một trong những framework PHP phổ biến nhất hiện nay nhờ vào hệ sinh thái phong phú và cú pháp gọn gàng. Trong hệ thống xác thực (authentication), hai phương thức thường khiến lập trình viên bối rối là auth()->check() và auth()->hasUser(). Ở bề nổi, cả hai đều liên quan đến việc kiểm […]","\n\u003Cp class=\"wp-block-paragraph\">Laravel là một trong những framework PHP phổ biến nhất hiện nay nhờ vào hệ sinh thái phong phú và cú pháp gọn gàng. Trong hệ thống xác thực (authentication), hai phương thức thường khiến lập trình viên bối rối là \u003Ccode>auth()-&gt;check()\u003C\u002Fcode> và \u003Ccode>auth()-&gt;hasUser()\u003C\u002Fcode>.\u003C\u002Fp>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Ở bề nổi, cả hai đều liên quan đến việc kiểm tra người dùng, nhưng mục đích sử dụng và hành vi của chúng lại hoàn toàn khác nhau. Bài viết này sẽ giúp bạn hiểu rõ sự khác biệt đó và khi nào nên dùng cái nào.\u003C\u002Fp>\n\n\n\n\u003Chr class=\"wp-block-separator has-alpha-channel-opacity\" \u002F>\n\n\n\n\u003Ch2 class=\"wp-block-heading\">🎯 1. \u003Ccode>auth()-&gt;check()\u003C\u002Fcode>: Kiểm tra người dùng đã đăng nhập\u003C\u002Fh2>\n\n\n\n\u003Ch3 class=\"wp-block-heading\">✅ Mục đích:\u003C\u002Fh3>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Xác định người dùng hiện tại đã \u003Cstrong>đăng nhập\u003C\u002Fstrong> (được xác thực) hay chưa.\u003C\u002Fp>\n\n\n\n\u003Ch3 class=\"wp-block-heading\">🔎 Cách hoạt động:\u003C\u002Fh3>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Phương thức này kiểm tra xem session hiện tại có chứa thông tin người dùng đã xác thực thành công hay không.\u003C\u002Fp>\n\n\n\n\u003Ch3 class=\"wp-block-heading\">📌 Ví dụ:\u003C\u002Fh3>\n\n\n\n\u003Cpre class=\"wp-block-code\">\u003Ccode>\u003Ccode>if (auth()-&gt;check()) {\n    \u002F\u002F Người dùng đã đăng nhập\n}\n\u003C\u002Fcode>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\n\n\u003Ch3 class=\"wp-block-heading\">🔁 Trả về:\u003C\u002Fh3>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>\u003Ccode>true\u003C\u002Fcode> nếu người dùng đã xác thực\u003C\u002Fli>\n\n\n\n\u003Cli>\u003Ccode>false\u003C\u002Fcode> nếu không\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Ch3 class=\"wp-block-heading\">🧠 Ghi nhớ:\u003C\u002Fh3>\n\n\n\n\u003Cblockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n\u003Cp class=\"wp-block-paragraph\">Đây là cách \u003Cstrong>tiêu chuẩn\u003C\u002Fstrong> để kiểm tra người dùng đã đăng nhập trong Laravel.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\n\n\n\u003Chr class=\"wp-block-separator has-alpha-channel-opacity\" \u002F>\n\n\n\n\u003Ch2 class=\"wp-block-heading\">🧩 2. \u003Ccode>auth()-&gt;hasUser()\u003C\u002Fcode>: Kiểm tra có user được gán\u003C\u002Fh2>\n\n\n\n\u003Ch3 class=\"wp-block-heading\">✅ Mục đích:\u003C\u002Fh3>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Xác định xem guard hiện tại có \u003Cstrong>đối tượng người dùng nào được gán (set)\u003C\u002Fstrong> hay không, bất kể trạng thái xác thực.\u003C\u002Fp>\n\n\n\n\u003Ch3 class=\"wp-block-heading\">🔎 Cách hoạt động:\u003C\u002Fh3>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">\u003Ccode>hasUser()\u003C\u002Fcode> chỉ đơn giản kiểm tra xem \u003Ccode>$this-&gt;user\u003C\u002Fcode> có tồn tại hay không — nghĩa là một đối tượng người dùng đã được gán vào guard, dù chưa được xác thực.\u003C\u002Fp>\n\n\n\n\u003Ch3 class=\"wp-block-heading\">📌 Ví dụ:\u003C\u002Fh3>\n\n\n\n\u003Cpre class=\"wp-block-code\">\u003Ccode>\u003Ccode>if (auth()-&gt;hasUser()) {\n    \u002F\u002F Có user được gán\n}\n\u003C\u002Fcode>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\n\n\u003Ch3 class=\"wp-block-heading\">🧪 Một tình huống hay gặp:\u003C\u002Fh3>\n\n\n\n\u003Cpre class=\"wp-block-code\">\u003Ccode>\u003Ccode>$user = User::find(1);\nAuth::setUser($user);\n\nauth()-&gt;hasUser(); \u002F\u002F true\nauth()-&gt;check();   \u002F\u002F false (vì chưa đăng nhập chính thức)\n\u003C\u002Fcode>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\n\n\u003Ch3 class=\"wp-block-heading\">🧠 Ghi nhớ:\u003C\u002Fh3>\n\n\n\n\u003Cblockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n\u003Cp class=\"wp-block-paragraph\">\u003Ccode>hasUser()\u003C\u002Fcode> hữu ích trong các tình huống testing, gán user thủ công hoặc xác thực tùy chỉnh mà không cần qua middleware.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\n\n\n\u003Chr class=\"wp-block-separator has-alpha-channel-opacity\" \u002F>\n\n\n\n\u003Ch2 class=\"wp-block-heading\">🔍 So sánh nhanh\u003C\u002Fh2>\n\n\n\n\u003Cfigure class=\"wp-block-table\">\u003Ctable class=\"has-fixed-layout\">\u003Cthead>\u003Ctr>\u003Cth>Tính năng\u003C\u002Fth>\u003Cth>\u003Ccode>auth()-&gt;check()\u003C\u002Fcode>\u003C\u002Fth>\u003Cth>\u003Ccode>auth()-&gt;hasUser()\u003C\u002Fcode>\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\u003Ctr>\u003Ctd>Kiểm tra user đã đăng nhập\u003C\u002Ftd>\u003Ctd>✅ Có\u003C\u002Ftd>\u003Ctd>❌ Không\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>Kiểm tra user được gán\u003C\u002Ftd>\u003Ctd>✅ Nếu đăng nhập\u003C\u002Ftd>\u003Ctd>✅ Nếu user được \u003Ccode>setUser()\u003C\u002Fcode>\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>Trường hợp gán user thủ công\u003C\u002Ftd>\u003Ctd>❌ Không phát hiện\u003C\u002Ftd>\u003Ctd>✅ Phát hiện\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>Thường dùng cho\u003C\u002Ftd>\u003Ctd>Xác thực đăng nhập thực tế\u003C\u002Ftd>\u003Ctd>Testing, logic nội bộ, tùy chỉnh\u003C\u002Ftd>\u003C\u002Ftr>\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Ffigure>\n\n\n\n\u003Chr class=\"wp-block-separator has-alpha-channel-opacity\" \u002F>\n\n\n\n\u003Ch2 class=\"wp-block-heading\">📌 Kết luận\u003C\u002Fh2>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>Sử dụng \u003Ccode>auth()-&gt;check()\u003C\u002Fcode> nếu bạn cần \u003Cstrong>xác minh rằng người dùng đã thực sự đăng nhập.\u003C\u002Fstrong>\u003C\u002Fli>\n\n\n\n\u003Cli>Sử dụng \u003Ccode>auth()-&gt;hasUser()\u003C\u002Fcode> nếu bạn chỉ cần kiểm tra \u003Cstrong>có user nào được gán vào guard hay chưa,\u003C\u002Fstrong> kể cả khi chưa đăng nhập.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Hiểu đúng sự khác biệt giữa hai phương thức này sẽ giúp bạn tránh những lỗi logic không đáng có khi xử lý xác thực trong Laravel, đặc biệt là trong những hệ thống lớn hoặc tích hợp phức tạp như API, OAuth hoặc testing unit.\u003C\u002Fp>\n","40f4cf9a-f5a4-4b6d-b27c-cb6253f353e0",{"id":168,"wordpressId":170,"filename":171,"storageKey":172,"sourceUrl":173,"mimeType":38,"altText":9,"caption":39,"width":41,"height":41,"createdAt":174,"updatedAt":43,"url":175},1976,"laravel-auth.png","wordpress\u002F2025\u002F06\u002Flaravel-auth.png","https:\u002F\u002Fvdhoangson.com\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002Flaravel-auth.png","2025-06-19T05:47:08.000Z","\u002Fuploads\u002Fwordpress\u002F2025\u002F06\u002Flaravel-auth.png",[177],{"id":47,"wordpressId":48,"name":49,"slug":50,"parentId":51},[179],{"id":58,"wordpressId":59,"name":50,"slug":50},"2025-06-19T05:50:59.000Z","2025-06-23T13:27:19.000Z",{"id":183,"wordpressId":184,"title":185,"slug":186,"excerpt":187,"contentHtml":188,"status":30,"authorName":31,"seoTitle":185,"seoDescription":187,"featuredMediaId":189,"featuredMedia":190,"categories":197,"tags":199,"publishedAt":201,"createdAt":201,"updatedAt":202},"08fcb0ab-1ea1-4bc7-961a-b28f8e7d624e",1965,"Laravel Octane – Tăng Tốc Ứng Dụng Laravel Lên Một Tầm Cao Mới","laravel-octane-tang-toc-ung-dung-laravel-len-mot-tam-cao-moi","🚀 Laravel luôn nổi tiếng là một framework PHP dễ dùng, mạnh mẽ và tiện lợi cho việc xây dựng ứng dụng web. Tuy nhiên, trong các ứng dụng cần hiệu năng cao hoặc xử lý lượng request lớn, Laravel truyền thống có thể trở nên chậm chạp do bản chất Stateless và việc khởi […]","\n\u003Cp class=\"wp-block-paragraph\">🚀 Laravel luôn nổi tiếng là một framework PHP dễ dùng, mạnh mẽ và tiện lợi cho việc xây dựng ứng dụng web. Tuy nhiên, trong các ứng dụng cần \u003Cstrong>hiệu năng cao\u003C\u002Fstrong> hoặc xử lý \u003Cstrong>lượng request lớn\u003C\u002Fstrong>, Laravel truyền thống có thể trở nên chậm chạp do bản chất \u003Cstrong>Stateless\u003C\u002Fstrong> và việc \u003Cstrong>khởi động lại toàn bộ ứng dụng trong mỗi request\u003C\u002Fstrong>.\u003C\u002Fp>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Laravel Octane ra đời để giải quyết vấn đề này.\u003C\u002Fp>\n\n\n\n\u003Chr class=\"wp-block-separator has-alpha-channel-opacity\" \u002F>\n\n\n\n\u003Ch2 class=\"wp-block-heading\">🧠 Laravel Octane Là Gì?\u003C\u002Fh2>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">\u003Cstrong>\u003Ca href=\"https:\u002F\u002Flaravel.com\u002Fdocs\u002F12.x\u002Foctane\" target=\"_blank\" rel=\"noopener noreferrer\">Laravel Octane\u003C\u002Fa>\u003C\u002Fstrong> là một package được giới thiệu từ Laravel 8, giúp \u003Cstrong>nâng cao hiệu năng\u003C\u002Fstrong> bằng cách \u003Cstrong>giữ ứng dụng Laravel “sống” trong bộ nhớ\u003C\u002Fstrong> thay vì phải khởi động lại trong mỗi request. Nó sử dụng \u003Cstrong>Swoole\u003C\u002Fstrong> hoặc \u003Cstrong>RoadRunner\u003C\u002Fstrong> làm server backend để chạy ứng dụng Laravel một cách lâu dài (persistent).\u003C\u002Fp>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">\u003Cstrong>Octane\u003C\u002Fstrong> biến Laravel thành một ứng dụng “long-living”, có nghĩa là:\u003C\u002Fp>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>Khởi động framework một lần.\u003C\u002Fli>\n\n\n\n\u003Cli>Tái sử dụng bộ nhớ và các thành phần khởi tạo cho nhiều request.\u003C\u002Fli>\n\n\n\n\u003Cli>Giảm thời gian phản hồi và tăng thông lượng (requests\u002Fsec).\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Chr class=\"wp-block-separator has-alpha-channel-opacity\" \u002F>\n\n\n\n\u003Ch2 class=\"wp-block-heading\">⚙️ Công Nghệ Đằng Sau Octane\u003C\u002Fh2>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Laravel Octane hỗ trợ hai backend chính:\u003C\u002Fp>\n\n\n\n\u003Ch3 class=\"wp-block-heading\">1. \u003Cstrong>Swoole\u003C\u002Fstrong>\u003C\u002Fh3>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>Một extension cho PHP, cho phép chạy ứng dụng PHP theo mô hình event-loop.\u003C\u002Fli>\n\n\n\n\u003Cli>Hỗ trợ coroutine, HTTP server, WebSocket, TCP\u002FUDP, và nhiều tính năng mạnh mẽ khác.\u003C\u002Fli>\n\n\n\n\u003Cli>Cần cài đặt Swoole vào hệ thống.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Ch3 class=\"wp-block-heading\">2. \u003Cstrong>RoadRunner\u003C\u002Fstrong>\u003C\u002Fh3>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>Là một high-performance PHP application server được viết bằng Golang.\u003C\u002Fli>\n\n\n\n\u003Cli>Có khả năng chạy worker và quản lý lifecycle ứng dụng tốt hơn \u003Ccode>php-fpm\u003C\u002Fcode>.\u003C\u002Fli>\n\n\n\n\u003Cli>Cần file cấu hình \u003Ccode>.rr.yaml\u003C\u002Fcode>.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Chr class=\"wp-block-separator has-alpha-channel-opacity\" \u002F>\n\n\n\n\u003Ch2 class=\"wp-block-heading\">✅ Ưu Điểm Của Laravel Octane\u003C\u002Fh2>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>🚀 \u003Cstrong>Tăng tốc độ xử lý request\u003C\u002Fstrong>: Thay vì mất 100-200ms khởi động Laravel mỗi request, Octane giúp giảm xuống chỉ còn vài ms.\u003C\u002Fli>\n\n\n\n\u003Cli>🔁 \u003Cstrong>Giữ session, database connection… trong bộ nhớ\u003C\u002Fstrong>: Giảm chi phí kết nối lặp lại.\u003C\u002Fli>\n\n\n\n\u003Cli>🧵 \u003Cstrong>Hỗ trợ xử lý song song (Concurrency)\u003C\u002Fstrong>: Cho phép xử lý nhiều tác vụ đồng thời, ví dụ như gọi API song song, xử lý background nhanh hơn.\u003C\u002Fli>\n\n\n\n\u003Cli>🧼 \u003Cstrong>Không cần queue system cho tác vụ nhỏ\u003C\u002Fstrong>: Với tính năng \u003Ccode>task()\u003C\u002Fcode> hoặc \u003Ccode>concurrently()\u003C\u002Fcode>, bạn có thể xử lý async ngay trong request.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Chr class=\"wp-block-separator has-alpha-channel-opacity\" \u002F>\n\n\n\n\u003Ch2 class=\"wp-block-heading\">🛠️ Cài Đặt Laravel Octane\u003C\u002Fh2>\n\n\n\n\u003Ch3 class=\"wp-block-heading\">Bước 1: Cài đặt Octane\u003C\u002Fh3>\n\n\n\n\u003Cpre class=\"wp-block-code\">\u003Ccode>\u003Ccode>composer require laravel\u002Foctane\nphp artisan octane:install\n\u003C\u002Fcode>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Chọn backend bạn muốn dùng: Swoole hoặc RoadRunner.\u003C\u002Fp>\n\n\n\n\u003Ch3 class=\"wp-block-heading\">Bước 2: Cài Swoole (nếu chọn)\u003C\u002Fh3>\n\n\n\n\u003Cpre class=\"wp-block-code\">\u003Ccode>\u003Ccode>pecl install swoole\n\u003C\u002Fcode>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Rồi thêm vào php.ini:\u003C\u002Fp>\n\n\n\n\u003Cpre class=\"wp-block-code\">\u003Ccode>\u003Ccode>extension=swoole\n\u003C\u002Fcode>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\n\n\u003Ch3 class=\"wp-block-heading\">Bước 3: Chạy Octane Server\u003C\u002Fh3>\n\n\n\n\u003Cpre class=\"wp-block-code\">\u003Ccode>\u003Ccode>php artisan octane:start\n\u003C\u002Fcode>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Bạn sẽ thấy ứng dụng chạy ở địa chỉ: \u003Ccode>http:\u002F\u002F127.0.0.1:8000\u003C\u002Fcode>\u003C\u002Fp>\n\n\n\n\u003Chr class=\"wp-block-separator has-alpha-channel-opacity\" \u002F>\n\n\n\n\u003Ch2 class=\"wp-block-heading\">🧪 So Sánh Hiệu Năng\u003C\u002Fh2>\n\n\n\n\u003Cfigure class=\"wp-block-table\">\u003Ctable class=\"has-fixed-layout\">\u003Cthead>\u003Ctr>\u003Cth>Công nghệ\u003C\u002Fth>\u003Cth>Requests\u002Fsecond (trung bình)\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\u003Ctr>\u003Ctd>Laravel + Apache\u002Fnginx + PHP-FPM\u003C\u002Ftd>\u003Ctd>300 – 500 req\u002Fs\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>Laravel Octane + Swoole\u003C\u002Ftd>\u003Ctd>1,000 – 5,000+ req\u002Fs\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>Laravel Octane + RoadRunner\u003C\u002Ftd>\u003Ctd>1,500 – 10,000+ req\u002Fs\u003C\u002Ftd>\u003C\u002Ftr>\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Ffigure>\n\n\n\n\u003Cblockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n\u003Cp class=\"wp-block-paragraph\">Con số có thể thay đổi tùy vào cấu hình server, cache, DB, middleware…\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\n\n\n\u003Chr class=\"wp-block-separator has-alpha-channel-opacity\" \u002F>\n\n\n\n\u003Ch2 class=\"wp-block-heading\">⚠️ Những Điều Cần Lưu Ý\u003C\u002Fh2>\n\n\n\n\u003Ch3 class=\"wp-block-heading\">1. \u003Cstrong>Ứng dụng phải “stateless”\u003C\u002Fstrong>\u003C\u002Fh3>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Vì Laravel được giữ “sống”, bạn không nên sử dụng các biến toàn cục (\u003Ccode>global\u003C\u002Fcode>, \u003Ccode>static\u003C\u002Fcode>) mà thay vào đó là dùng dịch vụ container.\u003C\u002Fp>\n\n\n\n\u003Ch3 class=\"wp-block-heading\">2. \u003Cstrong>Không nên cache dữ liệu trong biến cục bộ lâu dài\u003C\u002Fstrong>\u003C\u002Fh3>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Một biến bị giữ lại qua nhiều request có thể gây rò rỉ dữ liệu người dùng khác.\u003C\u002Fp>\n\n\n\n\u003Ch3 class=\"wp-block-heading\">3. \u003Cstrong>Không sử dụng file watcher mặc định khi chạy trong production\u003C\u002Fstrong>\u003C\u002Fh3>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Octane có hỗ trợ \u003Ccode>--watch\u003C\u002Fcode> để reload lại khi thay đổi code, chỉ nên dùng khi dev.\u003C\u002Fp>\n\n\n\n\u003Chr class=\"wp-block-separator has-alpha-channel-opacity\" \u002F>\n\n\n\n\u003Ch2 class=\"wp-block-heading\">📦 Một Số API Mới Từ Octane\u003C\u002Fh2>\n\n\n\n\u003Ch3 class=\"wp-block-heading\">Thực thi bất đồng bộ:\u003C\u002Fh3>\n\n\n\n\u003Cpre class=\"wp-block-code\">\u003Ccode>\u003Ccode>Octane::concurrently([\n    fn () =&gt; Http::get('\u002Fapi\u002Fnews'),\n    fn () =&gt; Http::get('\u002Fapi\u002Fproducts'),\n]);\n\u003C\u002Fcode>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\n\n\u003Ch3 class=\"wp-block-heading\">Gọi tác vụ async:\u003C\u002Fh3>\n\n\n\n\u003Cpre class=\"wp-block-code\">\u003Ccode>\u003Ccode>Octane::tick('my-job', fn () =&gt; doSomething());\n\u003C\u002Fcode>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\n\n\u003Chr class=\"wp-block-separator has-alpha-channel-opacity\" \u002F>\n\n\n\n\u003Ch2 class=\"wp-block-heading\">🧳 Khi Nào Nên Dùng Octane?\u003C\u002Fh2>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>Khi bạn cần tăng \u003Cstrong>hiệu năng\u003C\u002Fstrong> của ứng dụng mà \u003Cstrong>không cần tái cấu trúc lớn\u003C\u002Fstrong>.\u003C\u002Fli>\n\n\n\n\u003Cli>Khi bạn xử lý \u003Cstrong>nhiều request đồng thời\u003C\u002Fstrong>, như hệ thống API, realtime app, dashboard.\u003C\u002Fli>\n\n\n\n\u003Cli>Khi bạn muốn \u003Cstrong>giảm chi phí hạ tầng\u003C\u002Fstrong>, tận dụng server hiệu quả hơn.\u003C\u002Fli>\n\n\n\n\u003Cli>Tuy nhiên, nếu ứng dụng bạn nhẹ, ít traffic hoặc đơn giản thì \u003Cstrong>Octane không thật sự cần thiết\u003C\u002Fstrong>.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Chr class=\"wp-block-separator has-alpha-channel-opacity\" \u002F>\n\n\n\n\u003Ch2 class=\"wp-block-heading\">🔚 Kết Luận\u003C\u002Fh2>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Laravel Octane là một bước tiến mạnh mẽ giúp Laravel chạm gần hơn đến hiệu năng của Node.js, Go và các ngôn ngữ server-side hiệu suất cao khác. Tuy nhiên, việc sử dụng Octane cần hiểu rõ cơ chế hoạt động và đảm bảo rằng ứng dụng của bạn đủ điều kiện để chạy an toàn trên môi trường “long-living”.\u003C\u002Fp>\n\n\n\n\u003Cblockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n\u003Cp class=\"wp-block-paragraph\">Nếu bạn đang chạy hệ thống Laravel ở production với lượng truy cập lớn, hãy thử Octane – bạn sẽ thấy sự khác biệt rõ rệt.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n","804783fa-74fc-40c6-a088-6c3c7e47e17a",{"id":189,"wordpressId":191,"filename":192,"storageKey":193,"sourceUrl":194,"mimeType":38,"altText":9,"caption":39,"width":41,"height":41,"createdAt":195,"updatedAt":43,"url":196},1966,"laravel-octane.png","wordpress\u002F2025\u002F06\u002Flaravel-octane.png","https:\u002F\u002Fvdhoangson.com\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002Flaravel-octane.png","2025-06-14T08:26:38.000Z","\u002Fuploads\u002Fwordpress\u002F2025\u002F06\u002Flaravel-octane.png",[198],{"id":47,"wordpressId":48,"name":49,"slug":50,"parentId":51},[200],{"id":58,"wordpressId":59,"name":50,"slug":50},"2025-06-14T08:29:38.000Z","2025-06-23T13:55:12.000Z",7,1,12]