{"id":2626,"date":"2025-03-24T08:46:54","date_gmt":"2025-03-23T23:46:54","guid":{"rendered":"https:\/\/dexall.co.jp\/articles\/?p=2626"},"modified":"2025-03-24T08:47:23","modified_gmt":"2025-03-23T23:47:23","slug":"%e3%80%90%e4%bf%9d%e5%ad%98%e7%89%88%e3%80%91laravel%e3%81%aejob%e3%82%af%e3%83%a9%e3%82%b9%e3%81%a7%e5%ae%9f%e7%8f%be%e3%81%99%e3%82%8b%e9%ab%98%e9%80%9f%e3%81%aa%e9%9d%9e%e5%90%8c%e6%9c%9f%e5%87%a6","status":"publish","type":"post","link":"https:\/\/dexall.co.jp\/articles\/?p=2626","title":{"rendered":"\u3010\u4fdd\u5b58\u7248\u3011Laravel\u306eJob\u30af\u30e9\u30b9\u3067\u5b9f\u73fe\u3059\u308b\u9ad8\u901f\u306a\u975e\u540c\u671f\u51e6\u7406 &#8211; \u5b9f\u88c5\u304b\u3089\u904b\u7528\u307e\u3067\u5b8c\u5168\u30ac\u30a4\u30c9"},"content":{"rendered":"\n<div class=\"toc\"><br \/>\n<b>Warning<\/b>:  Undefined array key \"is_admin\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>116<\/b><br \/>\n<br \/>\n<b>Warning<\/b>:  Undefined array key \"is_category_top\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>121<\/b><br \/>\n<br \/>\n<b>Warning<\/b>:  Undefined array key \"is_top\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>128<\/b><br \/>\n    <div id=\"toc_container\" class=\"sgb-toc--bullets js-smooth-scroll\" data-dialog-title=\"\u76ee\u6b21\">\n      <p class=\"toc_title\">\u76ee\u6b21 <\/p>\n      <ul class=\"toc_list\">  <li class=\"first\">    <a href=\"#i-0\">Laravel\u306e\u30b8\u30e7\u30d6\u6a5f\u80fd\u3068\u306f\u4f55\u304b<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-1\">\u91cd\u3044\u51e6\u7406\u3092\u52b9\u7387\u7684\u306b\u6271\u3046\u305f\u3081\u306e\u30b8\u30e7\u30d6\u30b7\u30b9\u30c6\u30e0<\/a>      <\/li>      <li>        <a href=\"#i-2\">\u540c\u671f\u51e6\u7406\u3068\u975e\u540c\u671f\u51e6\u7406\u306e\u9055\u3044\u3092\u7406\u89e3\u3059\u308b<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-3\">\u306a\u305cLaravel\u3067\u30b8\u30e7\u30d6\u3092\u4f7f\u3046\u5fc5\u8981\u304c\u3042\u308b\u306e\u304b<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-4\">Job\u30af\u30e9\u30b9\u306e\u57fa\u672c\u7684\u306a\u5b9f\u88c5\u65b9\u6cd5<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-5\">artisan\u30b3\u30de\u30f3\u30c9\u3067Job\u30af\u30e9\u30b9\u3092\u751f\u6210\u3059\u308b<\/a>      <\/li>      <li>        <a href=\"#i-6\">handle\u30e1\u30bd\u30c3\u30c9\u306b\u51e6\u7406\u3092\u8a18\u8ff0\u3059\u308b<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-7\">\u30b8\u30e7\u30d6\u3092\u30c7\u30a3\u30b9\u30d1\u30c3\u30c1\u3059\u308b\u65b9\u6cd5<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-8\">\u5b9f\u8df5\u7684\u306a\u30b8\u30e7\u30d6\u51e6\u7406\u306e\u8a2d\u5b9a\u65b9\u6cd5<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-9\">\u30ad\u30e5\u30fc\u306e\u8a2d\u5b9a\u3068\u30c9\u30e9\u30a4\u30d0\u30fc\u306e\u9078\u629e<\/a>      <\/li>      <li>        <a href=\"#i-10\">\u30b8\u30e7\u30d6\u306e\u512a\u5148\u5ea6\u3092\u5236\u5fa1\u3059\u308b<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-11\">\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u3068\u518d\u8a66\u884c\u306e\u8a2d\u5b9a<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-12\">\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u3068\u30ed\u30b0\u7ba1\u7406<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-13\">\u5931\u6557\u3057\u305f\u30b8\u30e7\u30d6\u3092\u9069\u5207\u306b\u51e6\u7406\u3059\u308b<\/a>      <\/li>      <li>        <a href=\"#i-14\">\u30ed\u30b0\u3092\u6d3b\u7528\u3057\u305f\u30c7\u30d0\u30c3\u30b0\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-15\">\u76e3\u8996\u30b7\u30b9\u30c6\u30e0\u3068\u306e\u9023\u643a\u65b9\u6cd5<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-16\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-17\">\u30ad\u30e5\u30fc\u30ef\u30fc\u30ab\u30fc\u306e\u9069\u5207\u306a\u8a2d\u5b9a<\/a>      <\/li>      <li>        <a href=\"#i-18\">\u30d0\u30c3\u30c1\u51e6\u7406\u306b\u3088\u308b\u52b9\u7387\u5316<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-19\">\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u6700\u9069\u5316\u624b\u6cd5<\/a>      <\/li>    <\/ul>  <\/li>  <li class=\"last\">    <a href=\"#i-20\">\u672c\u756a\u74b0\u5883\u3067\u306e\u904b\u7528\u3068\u30b9\u30b1\u30fc\u30ea\u30f3\u30b0<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-21\">Supervisor\u3092\u4f7f\u7528\u3057\u305f\u30d7\u30ed\u30bb\u30b9\u7ba1\u7406<\/a>      <\/li>      <li>        <a href=\"#i-22\">\u6c34\u5e73\u30b9\u30b1\u30fc\u30ea\u30f3\u30b0\u306e\u5b9f\u73fe\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-23\">\u969c\u5bb3\u767a\u751f\u6642\u306e\u5bfe\u5fdc\u624b\u9806<\/a>      <\/li>    <\/ul>  <\/li><\/ul>\n      <a href=\"#\" class=\"sgb-toc-button js-toc-button\" rel=\"nofollow\" data-open-dialog=\"true\"><i class=\"fa fa-list\"><\/i><span class=\"sgb-toc-button__text\">\u76ee\u6b21\u3078<\/span><\/a>\n    <\/div><\/div><h2 class=\"wp-block-heading\" id=\"i-0\">Laravel\u306e\u30b8\u30e7\u30d6\u6a5f\u80fd\u3068\u306f\u4f55\u304b<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-1\">\u91cd\u3044\u51e6\u7406\u3092\u52b9\u7387\u7684\u306b\u6271\u3046\u305f\u3081\u306e\u30b8\u30e7\u30d6\u30b7\u30b9\u30c6\u30e0<\/h3>\n\n\n\n<p>Web\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u958b\u767a\u306b\u304a\u3044\u3066\u3001\u30e6\u30fc\u30b6\u30fc\u306e\u64cd\u4f5c\u306b\u5bfe\u3059\u308b\u30ec\u30b9\u30dd\u30f3\u30b9\u901f\u5ea6\u306f\u975e\u5e38\u306b\u91cd\u8981\u3067\u3059\u3002\u3057\u304b\u3057\u3001\u753b\u50cf\u51e6\u7406\u3084\u5927\u91cf\u306e\u30e1\u30fc\u30eb\u9001\u4fe1\u3001\u5916\u90e8API\u3068\u306e\u9023\u643a\u306a\u3069\u3001\u51e6\u7406\u306b\u6642\u9593\u304c\u304b\u304b\u308b\u6a5f\u80fd\u3092\u5b9f\u88c5\u3059\u308b\u5fc5\u8981\u304c\u51fa\u3066\u304f\u308b\u3053\u3068\u304c\u3042\u308a\u307e\u3059\u3002Laravel\u306e\u30b8\u30e7\u30d6\u6a5f\u80fd\u306f\u3001\u3053\u306e\u3088\u3046\u306a\u91cd\u3044\u51e6\u7406\u3092\u52b9\u7387\u7684\u306b\u6271\u3046\u305f\u3081\u306e\u4ed5\u7d44\u307f\u3092\u63d0\u4f9b\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u30b8\u30e7\u30d6\u30b7\u30b9\u30c6\u30e0\u306e\u4e3b\u306a\u7279\u5fb4\u306f\u4ee5\u4e0b\u306e\u901a\u308a\u3067\u3059\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u51e6\u7406\u306e\u975e\u540c\u671f\u5b9f\u884c<\/strong>: \u30e1\u30a4\u30f3\u306e\u51e6\u7406\u30d5\u30ed\u30fc\u304b\u3089\u5207\u308a\u96e2\u3057\u3066\u5b9f\u884c\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059<\/li>\n\n\n\n<li><strong>\u30ad\u30e5\u30fc\u306b\u3088\u308b\u5236\u5fa1<\/strong>: \u51e6\u7406\u306e\u9806\u5e8f\u3084\u512a\u5148\u5ea6\u3092\u5236\u5fa1\u3067\u304d\u307e\u3059<\/li>\n\n\n\n<li><strong>\u518d\u8a66\u884c\u6a5f\u80fd<\/strong>: \u5931\u6557\u3057\u305f\u51e6\u7406\u3092\u81ea\u52d5\u7684\u306b\u518d\u5b9f\u884c\u3067\u304d\u307e\u3059<\/li>\n\n\n\n<li><strong>\u5206\u6563\u51e6\u7406<\/strong>: \u8907\u6570\u306e\u30b5\u30fc\u30d0\u30fc\u3067\u51e6\u7406\u3092\u5206\u6563\u3055\u305b\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059<\/li>\n<\/ul>\n\n\n\n<p>\u4f8b\u3048\u3070\u3001\u30e6\u30fc\u30b6\u30fc\u767b\u9332\u6642\u306b\u30a6\u30a7\u30eb\u30ab\u30e0\u30e1\u30fc\u30eb\u3092\u9001\u4fe1\u3059\u308b\u51e6\u7406\u3092\u8003\u3048\u3066\u307f\u307e\u3057\u3087\u3046\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u5f93\u6765\u306e\u540c\u671f\u51e6\u7406\u306e\u5834\u5408\npublic function register(Request $request)\n{\n    $user = User::create($request-&gt;all());\n\n    \/\/ \u30e1\u30fc\u30eb\u9001\u4fe1\u304c\u5b8c\u4e86\u3059\u308b\u307e\u3067\u30ec\u30b9\u30dd\u30f3\u30b9\u304c\u8fd4\u3055\u308c\u306a\u3044\n    Mail::to($user-&gt;email)-&gt;send(new WelcomeMail($user));\n\n    return response()-&gt;json(['message' =&gt; '\u767b\u9332\u5b8c\u4e86']);\n}\n\n\/\/ \u30b8\u30e7\u30d6\u3092\u4f7f\u7528\u3057\u305f\u975e\u540c\u671f\u51e6\u7406\u306e\u5834\u5408\npublic function register(Request $request)\n{\n    $user = User::create($request-&gt;all());\n\n    \/\/ \u30e1\u30fc\u30eb\u9001\u4fe1\u3092\u30b8\u30e7\u30d6\u3068\u3057\u3066\u30ad\u30e5\u30fc\u306b\u6295\u5165\n    SendWelcomeMailJob::dispatch($user);\n\n    return response()-&gt;json(['message' =&gt; '\u767b\u9332\u5b8c\u4e86']);\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-2\">\u540c\u671f\u51e6\u7406\u3068\u975e\u540c\u671f\u51e6\u7406\u306e\u9055\u3044\u3092\u7406\u89e3\u3059\u308b<\/h3>\n\n\n\n<p>Laravel\u306b\u304a\u3051\u308b\u540c\u671f\u51e6\u7406\u3068\u975e\u540c\u671f\u51e6\u7406\u306e\u4e3b\u306a\u9055\u3044\u3092\u7406\u89e3\u3059\u308b\u3053\u3068\u306f\u3001\u30b8\u30e7\u30d6\u6a5f\u80fd\u3092\u52b9\u679c\u7684\u306b\u6d3b\u7528\u3059\u308b\u4e0a\u3067\u91cd\u8981\u3067\u3059\u3002<\/p>\n\n\n\n<p><strong>\u540c\u671f\u51e6\u7406\u306e\u7279\u5fb4\uff1a<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30ea\u30af\u30a8\u30b9\u30c8\u3092\u53d7\u3051\u3066\u304b\u3089\u4e00\u9023\u306e\u51e6\u7406\u304c\u5b8c\u4e86\u3059\u308b\u307e\u3067\u3001\u30ec\u30b9\u30dd\u30f3\u30b9\u304c\u8fd4\u3055\u308c\u307e\u305b\u3093<\/li>\n\n\n\n<li>\u51e6\u7406\u306e\u5b9f\u884c\u9806\u5e8f\u304c\u4e88\u6e2c\u53ef\u80fd\u3067\u3001\u7d50\u679c\u3092\u3059\u3050\u306b\u53d6\u5f97\u3067\u304d\u307e\u3059<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u305f\u5834\u5408\u3001\u5373\u5ea7\u306b\u691c\u77e5\u3057\u3066\u5bfe\u5fdc\u3067\u304d\u307e\u3059<\/li>\n\n\n\n<li>\u30b5\u30fc\u30d0\u30fc\u30ea\u30bd\u30fc\u30b9\u306e\u4f7f\u7528\u52b9\u7387\u304c\u4f4e\u4e0b\u3059\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059<\/li>\n<\/ol>\n\n\n\n<p><strong>\u975e\u540c\u671f\u51e6\u7406\u306e\u7279\u5fb4\uff1a<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u91cd\u3044\u51e6\u7406\u3092\u30d0\u30c3\u30af\u30b0\u30e9\u30a6\u30f3\u30c9\u3067\u5b9f\u884c\u3057\u3001\u30ec\u30b9\u30dd\u30f3\u30b9\u3092\u5373\u5ea7\u306b\u8fd4\u3059\u3053\u3068\u304c\u3067\u304d\u307e\u3059<\/li>\n\n\n\n<li>\u51e6\u7406\u306e\u5b9f\u884c\u9806\u5e8f\u3092\u5236\u5fa1\u53ef\u80fd\u3067\u3001\u512a\u5148\u5ea6\u3092\u8a2d\u5b9a\u3067\u304d\u307e\u3059<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u305f\u5834\u5408\u306e\u518d\u8a66\u884c\u6a5f\u80fd\u304c\u3042\u308a\u307e\u3059<\/li>\n\n\n\n<li>\u30b5\u30fc\u30d0\u30fc\u30ea\u30bd\u30fc\u30b9\u3092\u52b9\u7387\u7684\u306b\u4f7f\u7528\u3067\u304d\u307e\u3059<\/li>\n<\/ol>\n\n\n\n<p>\u4ee5\u4e0b\u306f\u3001\u540c\u671f\u51e6\u7406\u3068\u975e\u540c\u671f\u51e6\u7406\u306e\u51e6\u7406\u6642\u9593\u306e\u9055\u3044\u3092\u793a\u3059\u56f3\u3067\u3059\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u3010\u540c\u671f\u51e6\u7406\u3011\n\u30ea\u30af\u30a8\u30b9\u30c8\u53d7\u4fe1 \u2192 \u30e6\u30fc\u30b6\u30fc\u4f5c\u6210 \u2192 \u30e1\u30fc\u30eb\u9001\u4fe1 \u2192 \u30ec\u30b9\u30dd\u30f3\u30b9\u8fd4\u5374\n|--------------|--------------|--------------|\n     0.1\u79d2         0.1\u79d2          2\u79d2        = \u5408\u8a082.2\u79d2\n\n\u3010\u975e\u540c\u671f\u51e6\u7406\u3011\n\u30ea\u30af\u30a8\u30b9\u30c8\u53d7\u4fe1 \u2192 \u30e6\u30fc\u30b6\u30fc\u4f5c\u6210 \u2192 \u30ec\u30b9\u30dd\u30f3\u30b9\u8fd4\u5374\n|--------------|--------------|\n     0.1\u79d2         0.1\u79d2                     = \u5408\u8a080.2\u79d2\n            \u2193\n        \u30e1\u30fc\u30eb\u9001\u4fe1\uff08\u30d0\u30c3\u30af\u30b0\u30e9\u30a6\u30f3\u30c9\uff09\n        |--------------|\n             2\u79d2<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-3\">\u306a\u305cLaravel\u3067\u30b8\u30e7\u30d6\u3092\u4f7f\u3046\u5fc5\u8981\u304c\u3042\u308b\u306e\u304b<\/h3>\n\n\n\n<p>Laravel\u3067\u30b8\u30e7\u30d6\u3092\u4f7f\u7528\u3059\u308b\u4e3b\u306a\u30e1\u30ea\u30c3\u30c8\u306f\u4ee5\u4e0b\u306e\u901a\u308a\u3067\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30ec\u30b9\u30dd\u30f3\u30b9\u5411\u4e0a<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30e6\u30fc\u30b6\u30fc\u306e\u5f85\u3061\u6642\u9593\u3092\u6700\u5c0f\u9650\u306b\u6291\u3048\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059<\/li>\n\n\n\n<li>\u91cd\u3044\u51e6\u7406\u306b\u3088\u308b\u753b\u9762\u306e\u30d5\u30ea\u30fc\u30ba\u3092\u9632\u3050\u3053\u3068\u304c\u3067\u304d\u307e\u3059<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30b7\u30b9\u30c6\u30e0\u30ea\u30bd\u30fc\u30b9\u306e\u52b9\u7387\u7684\u306a\u5229\u7528<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>CPU\u8ca0\u8377\u306e\u9ad8\u3044\u51e6\u7406\u3092\u5206\u6563\u3067\u304d\u307e\u3059<\/li>\n\n\n\n<li>\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u3092\u30b3\u30f3\u30c8\u30ed\u30fc\u30eb\u3067\u304d\u307e\u3059<\/li>\n\n\n\n<li>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u63a5\u7d9a\u6570\u3092\u9069\u5207\u306b\u7ba1\u7406\u3067\u304d\u307e\u3059<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30b9\u30b1\u30fc\u30e9\u30d3\u30ea\u30c6\u30a3\u306e\u78ba\u4fdd<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u51e6\u7406\u91cf\u306e\u5897\u52a0\u306b\u5fdc\u3058\u3066\u3001\u30ad\u30e5\u30fc\u30ef\u30fc\u30ab\u30fc\u3092\u5897\u3084\u3059\u3053\u3068\u304c\u3067\u304d\u307e\u3059<\/li>\n\n\n\n<li>\u8907\u6570\u306e\u30b5\u30fc\u30d0\u30fc\u306b\u51e6\u7406\u3092\u5206\u6563\u3055\u305b\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u4fe1\u983c\u6027\u306e\u5411\u4e0a<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">   \/\/ \u518d\u8a66\u884c\u56de\u6570\u3068\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u3092\u6307\u5b9a\u3067\u304d\u308b\n   class ProcessVideoJob implements ShouldQueue\n   {\n       public $tries = 3; \/\/ \u5931\u6557\u6642\u306b3\u56de\u307e\u3067\u518d\u8a66\u884c\n       public $timeout = 120; \/\/ 120\u79d2\u3067\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\n\n       public function handle()\n       {\n           \/\/ \u52d5\u753b\u51e6\u7406\u306e\u30ed\u30b8\u30c3\u30af\n       }\n\n       public function failed($exception)\n       {\n           \/\/ \u5931\u6557\u6642\u306e\u51e6\u7406\n           Log::error('\u52d5\u753b\u51e6\u7406\u306b\u5931\u6557: ' . $exception-&gt;getMessage());\n       }\n   }<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u6a5f\u80fd\u306b\u3088\u308a\u3001Laravel\u306e\u30b8\u30e7\u30d6\u30b7\u30b9\u30c6\u30e0\u306f\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u5834\u9762\u3067\u7279\u306b\u52b9\u679c\u3092\u767a\u63ee\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5927\u91cf\u306e\u30e1\u30fc\u30eb\u9001\u4fe1\u51e6\u7406<\/li>\n\n\n\n<li>\u753b\u50cf\u30fb\u52d5\u753b\u306e\u51e6\u7406<\/li>\n\n\n\n<li>\u30ec\u30dd\u30fc\u30c8\u751f\u6210<\/li>\n\n\n\n<li>\u5916\u90e8API\u3068\u306e\u9023\u643a<\/li>\n\n\n\n<li>\u30d0\u30c3\u30c1\u51e6\u7406<\/li>\n\n\n\n<li>\u30c7\u30fc\u30bf\u306e\u96c6\u8a08\u30fb\u5206\u6790\u51e6\u7406<\/li>\n<\/ul>\n\n\n\n<p>\u5b9f\u969b\u306e\u958b\u767a\u73fe\u5834\u3067\u306f\u3001\u3053\u308c\u3089\u306e\u6a5f\u80fd\u3092\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001\u9ad8\u3044\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3068\u4fe1\u983c\u6027\u3092\u4e21\u7acb\u3057\u305f\u30b7\u30b9\u30c6\u30e0\u3092\u69cb\u7bc9\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-4\">Job\u30af\u30e9\u30b9\u306e\u57fa\u672c\u7684\u306a\u5b9f\u88c5\u65b9\u6cd5<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-5\">artisan\u30b3\u30de\u30f3\u30c9\u3067Job\u30af\u30e9\u30b9\u3092\u751f\u6210\u3059\u308b<\/h3>\n\n\n\n<p>Laravel\u3067\u306f\u3001artisan\u30b3\u30de\u30f3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u7c21\u5358\u306bJob\u30af\u30e9\u30b9\u306e\u3072\u306a\u5f62\u3092\u751f\u6210\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u57fa\u672c\u7684\u306a\u751f\u6210\u30b3\u30de\u30f3\u30c9\u306f\u4ee5\u4e0b\u306e\u901a\u308a\u3067\u3059\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u57fa\u672c\u7684\u306aJob\u30af\u30e9\u30b9\u306e\u751f\u6210\nphp artisan make:job ProcessPodcast\n\n# \u30ad\u30e5\u30fc\u6295\u5165\u53ef\u80fd\u306aJob\u30af\u30e9\u30b9\u3092\u751f\u6210\uff08--queue\u30aa\u30d7\u30b7\u30e7\u30f3\uff09\nphp artisan make:job ProcessPodcast --queue<\/pre>\n\n\n\n<p>\u751f\u6210\u3055\u308c\u308bJob\u30af\u30e9\u30b9\u306e\u57fa\u672c\u69cb\u9020\u306f\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u306a\u308a\u307e\u3059\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;?php\n\nnamespace App\\Jobs;\n\nuse Illuminate\\Bus\\Queueable;\nuse Illuminate\\Contracts\\Queue\\ShouldQueue;\nuse Illuminate\\Foundation\\Bus\\Dispatchable;\nuse Illuminate\\Queue\\InteractsWithQueue;\nuse Illuminate\\Queue\\SerializesModels;\n\nclass ProcessPodcast implements ShouldQueue\n{\n    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;\n\n    \/**\n     * \u30b8\u30e7\u30d6\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u751f\u6210\n     *\/\n    public function __construct()\n    {\n        \/\/\n    }\n\n    \/**\n     * \u30b8\u30e7\u30d6\u306e\u5b9f\u884c\n     *\/\n    public function handle()\n    {\n        \/\/\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-6\">handle\u30e1\u30bd\u30c3\u30c9\u306b\u51e6\u7406\u3092\u8a18\u8ff0\u3059\u308b<\/h3>\n\n\n\n<p><code>handle<\/code>\u30e1\u30bd\u30c3\u30c9\u306f\u3001\u30b8\u30e7\u30d6\u304c\u5b9f\u884c\u3055\u308c\u308b\u969b\u306b\u547c\u3073\u51fa\u3055\u308c\u308b\u4e2d\u5fc3\u7684\u306a\u30e1\u30bd\u30c3\u30c9\u3067\u3059\u3002\u5177\u4f53\u7684\u306a\u5b9f\u88c5\u4f8b\u3092\u898b\u3066\u3044\u304d\u307e\u3057\u3087\u3046\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;?php\n\nnamespace App\\Jobs;\n\nuse App\\Models\\Podcast;\nuse App\\Services\\AudioProcessor;\nuse Illuminate\\Bus\\Queueable;\nuse Illuminate\\Contracts\\Queue\\ShouldQueue;\nuse Illuminate\\Foundation\\Bus\\Dispatchable;\nuse Illuminate\\Queue\\InteractsWithQueue;\nuse Illuminate\\Queue\\SerializesModels;\nuse Illuminate\\Support\\Facades\\Log;\n\nclass ProcessPodcast implements ShouldQueue\n{\n    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;\n\n    protected $podcast;\n    protected $audioProcessor;\n\n    \/**\n     * \u30b8\u30e7\u30d6\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u751f\u6210\n     *\/\n    public function __construct(Podcast $podcast)\n    {\n        \/\/ \u30b3\u30f3\u30b9\u30c8\u30e9\u30af\u30bf\u3067\u5fc5\u8981\u306a\u30c7\u30fc\u30bf\u3092\u53d7\u3051\u53d6\u308b\n        $this-&gt;podcast = $podcast;\n    }\n\n    \/**\n     * \u30b8\u30e7\u30d6\u306e\u5b9f\u884c\n     *\/\n    public function handle(AudioProcessor $audioProcessor)\n    {\n        try {\n            \/\/ \u97f3\u58f0\u30d5\u30a1\u30a4\u30eb\u306e\u51e6\u7406\n            $processedFile = $audioProcessor-&gt;process(\n                $this-&gt;podcast-&gt;audio_file\n            );\n\n            \/\/ \u51e6\u7406\u7d50\u679c\u306e\u4fdd\u5b58\n            $this-&gt;podcast-&gt;update([\n                'processed_file' =&gt; $processedFile,\n                'processed_at' =&gt; now(),\n                'status' =&gt; 'completed'\n            ]);\n\n            \/\/ \u30ed\u30b0\u306e\u8a18\u9332\n            Log::info('Podcast processed successfully', [\n                'podcast_id' =&gt; $this-&gt;podcast-&gt;id\n            ]);\n        } catch (\\Exception $e) {\n            \/\/ \u30a8\u30e9\u30fc\u51e6\u7406\n            Log::error('Failed to process podcast', [\n                'podcast_id' =&gt; $this-&gt;podcast-&gt;id,\n                'error' =&gt; $e-&gt;getMessage()\n            ]);\n\n            throw $e;\n        }\n    }\n}<\/pre>\n\n\n\n<p>\u3053\u306e\u30b3\u30fc\u30c9\u306e\u91cd\u8981\u306a\u30dd\u30a4\u30f3\u30c8\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u4f9d\u5b58\u6027\u306e\u6ce8\u5165<\/strong>\uff1a<code>handle<\/code>\u30e1\u30bd\u30c3\u30c9\u306e\u5f15\u6570\u3067<code>AudioProcessor<\/code>\u3092\u6ce8\u5165\u3057\u3066\u3044\u307e\u3059<\/li>\n\n\n\n<li><strong>\u4f8b\u5916\u51e6\u7406<\/strong>\uff1atry-catch\u30d6\u30ed\u30c3\u30af\u3067\u30a8\u30e9\u30fc\u3092\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u3057\u3066\u3044\u307e\u3059<\/li>\n\n\n\n<li><strong>\u30ed\u30b0\u8a18\u9332<\/strong>\uff1a\u51e6\u7406\u306e\u9032\u884c\u72b6\u6cc1\u3084\u30a8\u30e9\u30fc\u3092\u30ed\u30b0\u306b\u8a18\u9332\u3057\u3066\u3044\u307e\u3059<\/li>\n\n\n\n<li><strong>\u30e2\u30c7\u30eb\u306e\u66f4\u65b0<\/strong>\uff1a\u51e6\u7406\u7d50\u679c\u3092\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u4fdd\u5b58\u3057\u3066\u3044\u307e\u3059<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-7\">\u30b8\u30e7\u30d6\u3092\u30c7\u30a3\u30b9\u30d1\u30c3\u30c1\u3059\u308b\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u30b8\u30e7\u30d6\u3092\u30ad\u30e5\u30fc\u306b\u6295\u5165\uff08\u30c7\u30a3\u30b9\u30d1\u30c3\u30c1\uff09\u3059\u308b\u65b9\u6cd5\u306f\u8907\u6570\u3042\u308a\u307e\u3059\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u65b9\u6cd51: dispatch\u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\nProcessPodcast::dispatch($podcast);\n\n\/\/ \u65b9\u6cd52: \u9045\u5ef6\u5b9f\u884c\u3092\u6307\u5b9a\nProcessPodcast::dispatch($podcast)-&gt;delay(now()-&gt;addMinutes(10));\n\n\/\/ \u65b9\u6cd53: \u7279\u5b9a\u306e\u30ad\u30e5\u30fc\u3092\u6307\u5b9a\nProcessPodcast::dispatch($podcast)-&gt;onQueue('processing');\n\n\/\/ \u65b9\u6cd54: \u30c1\u30a7\u30fc\u30f3\u5b9f\u884c\u3092\u6307\u5b9a\nProcessPodcast::withChain([\n    new OptimizePodcast($podcast),\n    new ReleasePodcast($podcast)\n])-&gt;dispatch($podcast);\n\n\/\/ \u65b9\u6cd55: \u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc\u3067\u306e\u4f7f\u7528\u4f8b\npublic function store(Request $request)\n{\n    $podcast = Podcast::create($request-&gt;validated());\n\n    \/\/ \u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u6e08\u307f\u306e\u30c7\u30fc\u30bf\u3092\u57fa\u306b\u30b8\u30e7\u30d6\u3092\u30c7\u30a3\u30b9\u30d1\u30c3\u30c1\n    ProcessPodcast::dispatch($podcast)\n        -&gt;onQueue('processing')\n        -&gt;delay(now()-&gt;addMinutes(5));\n\n    return response()-&gt;json([\n        'message' =&gt; 'Podcast processing has been queued',\n        'podcast_id' =&gt; $podcast-&gt;id\n    ]);\n}<\/pre>\n\n\n\n<p>\u30c7\u30a3\u30b9\u30d1\u30c3\u30c1\u6642\u306e\u4e3b\u306a\u30aa\u30d7\u30b7\u30e7\u30f3\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>delay()<\/strong>: \u5b9f\u884c\u3092\u9045\u5ef6\u3055\u305b\u308b<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">   ProcessPodcast::dispatch($podcast)\n       -&gt;delay(now()-&gt;addHours(2)); \/\/ 2\u6642\u9593\u5f8c\u306b\u5b9f\u884c<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>onQueue()<\/strong>: \u7279\u5b9a\u306e\u30ad\u30e5\u30fc\u3092\u6307\u5b9a<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">   ProcessPodcast::dispatch($podcast)\n       -&gt;onQueue('high-priority'); \/\/ \u512a\u5148\u5ea6\u306e\u9ad8\u3044\u30ad\u30e5\u30fc\u3067\u5b9f\u884c<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>withChain()<\/strong>: \u8907\u6570\u306e\u30b8\u30e7\u30d6\u3092\u9023\u7d9a\u5b9f\u884c<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">   ProcessPodcast::withChain([\n       new OptimizePodcast($podcast),\n       new NotifyUser($podcast-&gt;user)\n   ])-&gt;dispatch($podcast);<\/pre>\n\n\n\n<ol start=\"4\" class=\"wp-block-list\">\n<li><strong>afterCommit()<\/strong>: \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u5f8c\u306b\u5b9f\u884c<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">   ProcessPodcast::dispatch($podcast)\n       -&gt;afterCommit(); \/\/ \u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u5b8c\u4e86\u5f8c\u306b\u5b9f\u884c<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001\u67d4\u8edf\u306a\u30b8\u30e7\u30d6\u306e\u5b9f\u884c\u5236\u5fa1\u304c\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\u3002\u5b9f\u969b\u306e\u958b\u767a\u3067\u306f\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u8981\u4ef6\u306b\u5fdc\u3058\u3066\u9069\u5207\u306a\u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-8\">\u5b9f\u8df5\u7684\u306a\u30b8\u30e7\u30d6\u51e6\u7406\u306e\u8a2d\u5b9a\u65b9\u6cd5<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-9\">\u30ad\u30e5\u30fc\u306e\u8a2d\u5b9a\u3068\u30c9\u30e9\u30a4\u30d0\u30fc\u306e\u9078\u629e<\/h3>\n\n\n\n<p>Laravel\u3067\u306f\u3001\u8907\u6570\u306e\u30ad\u30e5\u30fc\u30c9\u30e9\u30a4\u30d0\u30fc\u3092\u5229\u7528\u3067\u304d\u307e\u3059\u3002\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u8981\u4ef6\u306b\u5fdc\u3058\u3066\u9069\u5207\u306a\u30c9\u30e9\u30a4\u30d0\u30fc\u3092\u9078\u629e\u3059\u308b\u3053\u3068\u304c\u91cd\u8981\u3067\u3059\u3002<\/p>\n\n\n\n<p>\u8a2d\u5b9a\u306f<code>config\/queue.php<\/code>\u3067\u884c\u3044\u307e\u3059\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">return [\n    'default' =&gt; env('QUEUE_CONNECTION', 'redis'),\n\n    'connections' =&gt; [\n        'database' =&gt; [\n            'driver' =&gt; 'database',\n            'table' =&gt; 'jobs',\n            'queue' =&gt; 'default',\n            'retry_after' =&gt; 90,\n            'after_commit' =&gt; false,\n        ],\n\n        'redis' =&gt; [\n            'driver' =&gt; 'redis',\n            'connection' =&gt; 'default',\n            'queue' =&gt; env('REDIS_QUEUE', 'default'),\n            'retry_after' =&gt; 90,\n            'block_for' =&gt; null,\n            'after_commit' =&gt; false,\n        ],\n\n        'sqs' =&gt; [\n            'driver' =&gt; 'sqs',\n            'key' =&gt; env('AWS_ACCESS_KEY_ID'),\n            'secret' =&gt; env('AWS_SECRET_ACCESS_KEY'),\n            'prefix' =&gt; env('SQS_PREFIX', 'https:\/\/sqs.us-east-1.amazonaws.com\/your-account-id'),\n            'queue' =&gt; env('SQS_QUEUE', 'default'),\n            'suffix' =&gt; env('SQS_SUFFIX'),\n            'region' =&gt; env('AWS_DEFAULT_REGION', 'us-east-1'),\n            'after_commit' =&gt; false,\n        ],\n    ],\n];<\/pre>\n\n\n\n<p>\u4e3b\u306a\u30c9\u30e9\u30a4\u30d0\u30fc\u306e\u7279\u5fb4\u6bd4\u8f03\uff1a<\/p>\n\n\n<div id=\"id-474f1ad9-8dd9-4251-a28d-3fecdb9fcf6c\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u30c9\u30e9\u30a4\u30d0\u30fc<\/th><th>\u7279\u5fb4<\/th><th>\u9069\u7528\u5834\u9762<\/th><th>\u6ce8\u610f\u70b9<\/th><\/tr><\/thead><tbody><tr><td>Database<\/td><td>\u2013 \u8a2d\u5b9a\u304c\u7c21\u5358<br>\u2013 \u8ffd\u52a0\u306e\u30b5\u30fc\u30d3\u30b9\u4e0d\u8981<\/td><td>\u5c0f\u301c\u4e2d\u898f\u6a21\u306e\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3<\/td><td>\u2013 \u30b9\u30b1\u30fc\u30e9\u30d3\u30ea\u30c6\u30a3\u306b\u5236\u9650\u3042\u308a<br>\u2013 DB\u306e\u8ca0\u8377\u5897\u52a0<\/td><\/tr><tr><td>Redis<\/td><td>\u2013 \u9ad8\u901f<br>\u2013 \u30b9\u30b1\u30fc\u30e9\u30d6\u30eb<\/td><td>\u4e2d\u301c\u5927\u898f\u6a21\u306e\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3<\/td><td>\u2013 Redis\u30b5\u30fc\u30d0\u30fc\u306e\u7ba1\u7406\u304c\u5fc5\u8981<\/td><\/tr><tr><td>SQS<\/td><td>\u2013 \u9ad8\u3044\u4fe1\u983c\u6027<br>\u2013 \u7121\u5236\u9650\u306e\u30b9\u30b1\u30fc\u30eb<\/td><td>\u30a8\u30f3\u30bf\u30fc\u30d7\u30e9\u30a4\u30ba\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3<\/td><td>\u2013 \u30b3\u30b9\u30c8\u304c\u767a\u751f<br>\u2013 \u8a2d\u5b9a\u304c\u3084\u3084\u8907\u96d1<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"i-10\">\u30b8\u30e7\u30d6\u306e\u512a\u5148\u5ea6\u3092\u5236\u5fa1\u3059\u308b<\/h3>\n\n\n\n<p>\u30b8\u30e7\u30d6\u306e\u512a\u5148\u5ea6\u5236\u5fa1\u306f\u3001\u52b9\u7387\u7684\u306a\u30ea\u30bd\u30fc\u30b9\u5229\u7528\u306e\u305f\u3081\u306b\u91cd\u8981\u3067\u3059\u3002Laravel\u3067\u306f\u8907\u6570\u306e\u65b9\u6cd5\u3067\u512a\u5148\u5ea6\u3092\u5236\u5fa1\u3067\u304d\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30ad\u30e5\u30fc\u540d\u306b\u3088\u308b\u512a\u5148\u5ea6\u4ed8\u3051<\/strong>\uff1a<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30ad\u30e5\u30fc\u306e\u5b9a\u7fa9\uff08config\/queue.php\uff09\n'redis' =&gt; [\n    'driver' =&gt; 'redis',\n    'connection' =&gt; 'default',\n    'queue' =&gt; ['high', 'default', 'low'],\n    'retry_after' =&gt; 90,\n],\n\n\/\/ \u30b8\u30e7\u30d6\u306e\u30c7\u30a3\u30b9\u30d1\u30c3\u30c1\nHighPriorityJob::dispatch()-&gt;onQueue('high');\nRegularJob::dispatch()-&gt;onQueue('default');\nLowPriorityJob::dispatch()-&gt;onQueue('low');\n\n\/\/ \u30ad\u30e5\u30fc\u30ef\u30fc\u30ab\u30fc\u306e\u8d77\u52d5\nphp artisan queue:work --queue=high,default,low<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30b8\u30e7\u30d6\u30af\u30e9\u30b9\u3067\u306e\u512a\u5148\u5ea6\u8a2d\u5b9a<\/strong>\uff1a<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class HighPriorityJob implements ShouldQueue\n{\n    public $queue = 'high';\n\n    \/\/ \u30ad\u30e5\u30fc\u306e\u5b9f\u884c\u9806\u5e8f\u3092\u5236\u5fa1\n    public function middleware()\n    {\n        return [new WithoutOverlapping('high-priority-job')];\n    }\n}<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u52d5\u7684\u306a\u512a\u5148\u5ea6\u8a2d\u5b9a<\/strong>\uff1a<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class ProcessOrder implements ShouldQueue\n{\n    protected $order;\n\n    public function __construct(Order $order)\n    {\n        $this-&gt;order = $order;\n    }\n\n    public function handle()\n    {\n        \/\/ \u6ce8\u6587\u91d1\u984d\u306b\u5fdc\u3058\u3066\u512a\u5148\u5ea6\u3092\u5909\u66f4\n        if ($this-&gt;order-&gt;total &gt; 100000) {\n            $this-&gt;onQueue('high');\n        }\n\n        \/\/ \u51e6\u7406\u30ed\u30b8\u30c3\u30af\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-11\">\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u3068\u518d\u8a66\u884c\u306e\u8a2d\u5b9a<\/h3>\n\n\n\n<p>\u30b8\u30e7\u30d6\u306e\u4fe1\u983c\u6027\u3092\u9ad8\u3081\u308b\u305f\u3081\u306b\u3001\u9069\u5207\u306a\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u3068\u518d\u8a66\u884c\u306e\u8a2d\u5b9a\u304c\u91cd\u8981\u3067\u3059\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class ProcessLargeFile implements ShouldQueue\n{\n    \/\/ \u518d\u8a66\u884c\u56de\u6570\u306e\u8a2d\u5b9a\n    public $tries = 3;\n\n    \/\/ \u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u306e\u8a2d\u5b9a\uff08\u79d2\uff09\n    public $timeout = 120;\n\n    \/\/ \u518d\u8a66\u884c\u307e\u3067\u306e\u5f85\u6a5f\u6642\u9593\u3092\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\n    public function backoff()\n    {\n        return [60, 120, 180]; \/\/ 1\u5206\u30012\u5206\u30013\u5206\u5f8c\u306b\u518d\u8a66\u884c\n    }\n\n    \/\/ \u518d\u8a66\u884c\u306e\u6761\u4ef6\u3092\u5236\u5fa1\n    public function retryUntil()\n    {\n        return now()-&gt;addHours(1); \/\/ 1\u6642\u9593\u307e\u3067\u518d\u8a66\u884c\u3092\u7d9a\u3051\u308b\n    }\n\n    \/\/ \u5931\u6557\u6642\u306e\u51e6\u7406\n    public function failed(\\Throwable $exception)\n    {\n        Log::error('\u30d5\u30a1\u30a4\u30eb\u51e6\u7406\u306b\u5931\u6557', [\n            'exception' =&gt; $exception-&gt;getMessage(),\n            'file' =&gt; $this-&gt;filePath\n        ]);\n\n        \/\/ \u7ba1\u7406\u8005\u306b\u901a\u77e5\n        Notification::route('mail', 'admin@example.com')\n            -&gt;notify(new JobFailedNotification($this, $exception));\n    }\n}<\/pre>\n\n\n\n<p>\u5b9f\u88c5\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u6bb5\u968e\u7684\u306a\u518d\u8a66\u884c\u9593\u9694\u306e\u8a2d\u5b9a<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public function backoff()\n{\n    \/\/ \u6307\u6570\u95a2\u6570\u7684\u306a\u5f85\u6a5f\u6642\u9593\u306e\u5897\u52a0\n    return [\n        10,  \/\/ \u6700\u521d\u306e\u518d\u8a66\u884c\n        30,  \/\/ 2\u56de\u76ee\u306e\u518d\u8a66\u884c\n        60,  \/\/ 3\u56de\u76ee\u306e\u518d\u8a66\u884c\n        120, \/\/ 4\u56de\u76ee\u306e\u518d\u8a66\u884c\n    ];\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u6761\u4ef6\u4ed8\u304d\u306e\u518d\u8a66\u884c\u30ed\u30b8\u30c3\u30af<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public function failed(\\Throwable $exception)\n{\n    if ($exception instanceof TemporaryException) {\n        \/\/ \u4e00\u6642\u7684\u306a\u30a8\u30e9\u30fc\u306e\u5834\u5408\u306f\u518d\u8a66\u884c\n        $this-&gt;release(30); \/\/ 30\u79d2\u5f8c\u306b\u518d\u8a66\u884c\n    } else {\n        \/\/ \u6c38\u7d9a\u7684\u306a\u30a8\u30e9\u30fc\u306e\u5834\u5408\u306f\u5931\u6557\u3068\u3057\u3066\u51e6\u7406\n        $this-&gt;delete();\n        Log::error('\u6c38\u7d9a\u7684\u306a\u30a8\u30e9\u30fc\u304c\u767a\u751f', [\n            'exception' =&gt; $exception\n        ]);\n    }\n}<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u30ea\u30bd\u30fc\u30b9\u7ba1\u7406\u306e\u6700\u9069\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public function handle()\n{\n    \/\/ \u30e1\u30e2\u30ea\u5236\u9650\u306e\u8a2d\u5b9a\n    ini_set('memory_limit', '512M');\n\n    \/\/ \u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u306e\u52d5\u7684\u8a2d\u5b9a\n    set_time_limit(300); \/\/ 5\u5206\n\n    \/\/ \u5927\u304d\u306a\u30d5\u30a1\u30a4\u30eb\u306e\u51e6\u7406\n    $this-&gt;processLargeFile();\n}<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u8a2d\u5b9a\u3092\u9069\u5207\u306b\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001\u4fe1\u983c\u6027\u306e\u9ad8\u3044\u30b8\u30e7\u30d6\u51e6\u7406\u30b7\u30b9\u30c6\u30e0\u3092\u69cb\u7bc9\u3067\u304d\u307e\u3059\u3002\u30b7\u30b9\u30c6\u30e0\u306e\u898f\u6a21\u3084\u8981\u4ef6\u306b\u5fdc\u3058\u3066\u3001\u3053\u308c\u3089\u306e\u5024\u3092\u8abf\u6574\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-12\">\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u3068\u30ed\u30b0\u7ba1\u7406<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-13\">\u5931\u6557\u3057\u305f\u30b8\u30e7\u30d6\u3092\u9069\u5207\u306b\u51e6\u7406\u3059\u308b<\/h3>\n\n\n\n<p>\u30b8\u30e7\u30d6\u306e\u5931\u6557\u306f\u907f\u3051\u3089\u308c\u306a\u3044\u554f\u984c\u3067\u3059\u3002\u9069\u5207\u306a\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u3092\u5b9f\u88c5\u3059\u308b\u3053\u3068\u3067\u3001\u30b7\u30b9\u30c6\u30e0\u306e\u4fe1\u983c\u6027\u3092\u9ad8\u3081\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u57fa\u672c\u7684\u306a\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class ProcessVideoJob implements ShouldQueue\n{\n    use InteractsWithQueue, Queueable, SerializesModels;\n\n    protected $video;\n    public $tries = 3;\n\n    public function __construct(Video $video)\n    {\n        $this-&gt;video = $video;\n    }\n\n    public function handle()\n    {\n        try {\n            \/\/ \u52d5\u753b\u51e6\u7406\u30ed\u30b8\u30c3\u30af\n            $this-&gt;processVideo();\n        } catch (VideoProcessingException $e) {\n            \/\/ \u52d5\u753b\u51e6\u7406\u7279\u6709\u306e\u30a8\u30e9\u30fc\u51e6\u7406\n            $this-&gt;handleVideoProcessingError($e);\n            throw $e;\n        } catch (\\Exception $e) {\n            \/\/ \u305d\u306e\u4ed6\u306e\u4e88\u671f\u305b\u306c\u30a8\u30e9\u30fc\n            $this-&gt;handleUnexpectedError($e);\n            throw $e;\n        }\n    }\n\n    protected function handleVideoProcessingError($e)\n    {\n        \/\/ \u30a8\u30e9\u30fc\u72b6\u614b\u3092\u8a18\u9332\n        $this-&gt;video-&gt;update([\n            'status' =&gt; 'processing_failed',\n            'error_message' =&gt; $e-&gt;getMessage()\n        ]);\n\n        \/\/ \u7ba1\u7406\u8005\u306b\u901a\u77e5\n        Notification::route('slack', config('notifications.slack_webhook'))\n            -&gt;notify(new VideoProcessingFailedNotification($this-&gt;video, $e));\n    }\n\n    protected function handleUnexpectedError($e)\n    {\n        Log::error('Unexpected error in video processing', [\n            'video_id' =&gt; $this-&gt;video-&gt;id,\n            'error' =&gt; $e-&gt;getMessage(),\n            'trace' =&gt; $e-&gt;getTraceAsString()\n        ]);\n    }\n\n    public function failed(\\Throwable $exception)\n    {\n        \/\/ \u6700\u7d42\u7684\u306a\u5931\u6557\u6642\u306e\u51e6\u7406\n        $this-&gt;video-&gt;update(['status' =&gt; 'permanently_failed']);\n\n        \/\/ \u30e6\u30fc\u30b6\u30fc\u306b\u901a\u77e5\n        $this-&gt;video-&gt;user-&gt;notify(new VideoProcessingFailedNotification($this-&gt;video));\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u6761\u4ef6\u4ed8\u304d\u306e\u518d\u8a66\u884c\u30ed\u30b8\u30c3\u30af<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class ImportDataJob implements ShouldQueue\n{\n    public function handle()\n    {\n        try {\n            $response = Http::timeout(30)-&gt;get('external-api.com\/data');\n\n            if ($response-&gt;failed()) {\n                \/\/ \u30ec\u30b9\u30dd\u30f3\u30b9\u30b3\u30fc\u30c9\u306b\u57fa\u3065\u304f\u518d\u8a66\u884c\u5224\u65ad\n                if ($response-&gt;status() &gt;= 500) {\n                    \/\/ \u30b5\u30fc\u30d0\u30fc\u30a8\u30e9\u30fc\u306e\u5834\u5408\u306f\u518d\u8a66\u884c\n                    $this-&gt;release(30); \/\/ 30\u79d2\u5f8c\u306b\u518d\u8a66\u884c\n                    return;\n                }\n\n                if ($response-&gt;status() === 429) {\n                    \/\/ \u30ec\u30fc\u30c8\u5236\u9650\u306e\u5834\u5408\u306f\u5f85\u6a5f\u6642\u9593\u3092\u9577\u3081\u306b\n                    $this-&gt;release(300); \/\/ 5\u5206\u5f8c\u306b\u518d\u8a66\u884c\n                    return;\n                }\n            }\n\n            \/\/ \u6b63\u5e38\u306a\u30ec\u30b9\u30dd\u30f3\u30b9\u306e\u51e6\u7406\n            $this-&gt;processResponse($response);\n\n        } catch (\\Exception $e) {\n            $this-&gt;handleException($e);\n        }\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-14\">\u30ed\u30b0\u3092\u6d3b\u7528\u3057\u305f\u30c7\u30d0\u30c3\u30b0\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u52b9\u679c\u7684\u306a\u30ed\u30b0\u7ba1\u7406\u306f\u554f\u984c\u306e\u65e9\u671f\u767a\u898b\u3068\u89e3\u6c7a\u306b\u4e0d\u53ef\u6b20\u3067\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u69cb\u9020\u5316\u30ed\u30b0\u306e\u5b9f\u88c5<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class ProcessOrderJob implements ShouldQueue\n{\n    protected $order;\n\n    public function handle()\n    {\n        Log::info('Starting order processing', [\n            'job_id' =&gt; $this-&gt;job-&gt;getJobId(),\n            'order_id' =&gt; $this-&gt;order-&gt;id,\n            'customer_id' =&gt; $this-&gt;order-&gt;customer_id,\n            'amount' =&gt; $this-&gt;order-&gt;total_amount,\n            'items_count' =&gt; $this-&gt;order-&gt;items-&gt;count()\n        ]);\n\n        try {\n            \/\/ \u51e6\u7406\u306e\u5404\u30b9\u30c6\u30c3\u30d7\u3092\u30ed\u30b0\n            Log::debug('Validating order items');\n            $this-&gt;validateItems();\n\n            Log::debug('Processing payment');\n            $this-&gt;processPayment();\n\n            Log::debug('Updating inventory');\n            $this-&gt;updateInventory();\n\n            Log::info('Order processing completed', [\n                'order_id' =&gt; $this-&gt;order-&gt;id,\n                'processing_time' =&gt; $this-&gt;job-&gt;getTimeElapsed()\n            ]);\n\n        } catch (\\Exception $e) {\n            Log::error('Order processing failed', [\n                'order_id' =&gt; $this-&gt;order-&gt;id,\n                'error' =&gt; $e-&gt;getMessage(),\n                'trace' =&gt; $e-&gt;getTraceAsString(),\n                'step' =&gt; $this-&gt;getCurrentStep(),\n                'memory_usage' =&gt; memory_get_usage(true)\n            ]);\n            throw $e;\n        }\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30ab\u30b9\u30bf\u30e0\u30ed\u30b0\u30c1\u30e3\u30f3\u30cd\u30eb\u306e\u8a2d\u5b9a<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ config\/logging.php\n'channels' =&gt; [\n    'jobs' =&gt; [\n        'driver' =&gt; 'daily',\n        'path' =&gt; storage_path('logs\/jobs.log'),\n        'level' =&gt; 'debug',\n        'days' =&gt; 14,\n    ],\n    'failed_jobs' =&gt; [\n        'driver' =&gt; 'stack',\n        'channels' =&gt; ['daily', 'slack'],\n        'ignore_exceptions' =&gt; false,\n    ],\n],<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-15\">\u76e3\u8996\u30b7\u30b9\u30c6\u30e0\u3068\u306e\u9023\u643a\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u30b8\u30e7\u30d6\u306e\u5b9f\u884c\u72b6\u6cc1\u3092\u52b9\u679c\u7684\u306b\u76e3\u8996\u3059\u308b\u305f\u3081\u306e\u8a2d\u5b9a\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Horizon\u306b\u3088\u308b\u76e3\u8996<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ config\/horizon.php\nreturn [\n    'metrics' =&gt; [\n        'trim_snapshots' =&gt; [\n            'job' =&gt; 24,     \/\/ 24\u6642\u9593\u5206\u306e\u30b8\u30e7\u30d6\u30e1\u30c8\u30ea\u30af\u30b9\u3092\u4fdd\u6301\n            'queue' =&gt; 24,   \/\/ 24\u6642\u9593\u5206\u306e\u30ad\u30e5\u30fc\u30e1\u30c8\u30ea\u30af\u30b9\u3092\u4fdd\u6301\n        ],\n    ],\n\n    'monitoring' =&gt; [\n        'failed' =&gt; [\n            ProcessOrderJob::class =&gt; [\n                \/\/ \u5931\u6557\u56de\u6570\u304c10\u56de\u3092\u8d85\u3048\u305f\u3089\u901a\u77e5\n                'threshold' =&gt; 10,\n                'notification' =&gt; \\App\\Notifications\\FailedJobsNotification::class,\n                'recipients' =&gt; ['slack'],\n            ],\n        ],\n    ],\n];<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30ab\u30b9\u30bf\u30e0\u76e3\u8996\u306e\u5b9f\u88c5<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class JobMonitoringService\n{\n    public function trackJobExecution(Job $job, float $startTime)\n    {\n        $executionTime = microtime(true) - $startTime;\n\n        \/\/ \u30e1\u30c8\u30ea\u30af\u30b9\u306e\u8a18\u9332\n        Redis::hincrby(\"job_metrics:{$job-&gt;getName()}\", 'total_executions', 1);\n        Redis::hincrbyfloat(\"job_metrics:{$job-&gt;getName()}\", 'total_time', $executionTime);\n\n        \/\/ \u5b9f\u884c\u6642\u9593\u306e\u95be\u5024\u30c1\u30a7\u30c3\u30af\n        if ($executionTime &gt; config(\"job_thresholds.{$job-&gt;getName()}\", 30)) {\n            $this-&gt;notifySlowJob($job, $executionTime);\n        }\n    }\n\n    protected function notifySlowJob($job, $executionTime)\n    {\n        Notification::route('slack', config('notifications.slack_webhook'))\n            -&gt;notify(new SlowJobNotification($job, $executionTime));\n    }\n}<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u30e1\u30c8\u30ea\u30af\u30b9\u53ce\u96c6\u306e\u81ea\u52d5\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class TrackJobPerformance\n{\n    public function handle($job, $next)\n    {\n        $startTime = microtime(true);\n        $memoryBefore = memory_get_usage();\n\n        try {\n            $result = $next($job);\n\n            \/\/ \u6210\u529f\u6642\u306e\u30e1\u30c8\u30ea\u30af\u30b9\u8a18\u9332\n            $this-&gt;recordMetrics($job, $startTime, $memoryBefore, 'success');\n\n            return $result;\n        } catch (\\Exception $e) {\n            \/\/ \u5931\u6557\u6642\u306e\u30e1\u30c8\u30ea\u30af\u30b9\u8a18\u9332\n            $this-&gt;recordMetrics($job, $startTime, $memoryBefore, 'failed');\n            throw $e;\n        }\n    }\n\n    protected function recordMetrics($job, $startTime, $memoryBefore, $status)\n    {\n        $metrics = [\n            'execution_time' =&gt; microtime(true) - $startTime,\n            'memory_usage' =&gt; memory_get_usage() - $memoryBefore,\n            'status' =&gt; $status,\n            'queue' =&gt; $job-&gt;queue ?? 'default',\n            'timestamp' =&gt; now(),\n        ];\n\n        \/\/ \u30e1\u30c8\u30ea\u30af\u30b9\u306e\u4fdd\u5b58\n        Redis::hset(\n            \"job_metrics:{$job-&gt;getName()}:\" . now()-&gt;format('Y-m-d'),\n            (string) now()-&gt;timestamp,\n            json_encode($metrics)\n        );\n    }\n}<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u5b9f\u88c5\u306b\u3088\u308a\u3001\u30b8\u30e7\u30d6\u306e\u5b9f\u884c\u72b6\u6cc1\u3092\u8a73\u7d30\u306b\u628a\u63e1\u3057\u3001\u554f\u984c\u304c\u767a\u751f\u3057\u305f\u969b\u306b\u901f\u3084\u304b\u306b\u5bfe\u5fdc\u3059\u308b\u3053\u3068\u304c\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-16\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-17\">\u30ad\u30e5\u30fc\u30ef\u30fc\u30ab\u30fc\u306e\u9069\u5207\u306a\u8a2d\u5b9a<\/h3>\n\n\n\n<p>\u30ad\u30e5\u30fc\u30ef\u30fc\u30ab\u30fc\u306e\u8a2d\u5b9a\u306f\u3001\u30b8\u30e7\u30d6\u51e6\u7406\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306b\u76f4\u63a5\u5f71\u97ff\u3092\u4e0e\u3048\u307e\u3059\u3002\u4ee5\u4e0b\u306b\u3001\u6700\u9069\u306a\u8a2d\u5b9a\u65b9\u6cd5\u3092\u8aac\u660e\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30ef\u30fc\u30ab\u30fc\u30d7\u30ed\u30bb\u30b9\u306e\u8a2d\u5b9a<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u57fa\u672c\u7684\u306a\u30ef\u30fc\u30ab\u30fc\u8d77\u52d5\nphp artisan queue:work\n\n# \u8907\u6570\u306e\u30ad\u30e5\u30fc\u3092\u512a\u5148\u5ea6\u9806\u306b\u51e6\u7406\nphp artisan queue:work --queue=high,default,low\n\n# \u30e1\u30e2\u30ea\u5236\u9650\u3068\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u306e\u8a2d\u5b9a\nphp artisan queue:work --memory=1024 --timeout=60\n\n# \u6700\u5927\u8a66\u884c\u56de\u6570\u306e\u8a2d\u5b9a\nphp artisan queue:work --tries=3<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>Supervisor\u306e\u8a2d\u5b9a\u4f8b<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">[program:laravel-worker]\nprocess_name=%(program_name)s_%(process_num)02d\ncommand=php \/var\/www\/html\/artisan queue:work redis --sleep=3 --tries=3 --max-time=3600\nautostart=true\nautorestart=true\nstopasgroup=true\nkillasgroup=true\nuser=www-data\nnumprocs=8\nredirect_stderr=true\nstdout_logfile=\/var\/log\/worker.log\nstopwaitsecs=3600<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u6700\u9069\u306a\u30ef\u30fc\u30ab\u30fc\u6570\u306e\u8a08\u7b97<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class WorkerOptimizer\n{\n    public function calculateOptimalWorkers()\n    {\n        $cpuCores = $this-&gt;getCPUCores();\n        $availableMemory = $this-&gt;getAvailableMemory();\n        $averageJobMemory = $this-&gt;getAverageJobMemory();\n\n        \/\/ CPU\u4f7f\u7528\u7387\u3092\u8003\u616e\u3057\u305f\u30ef\u30fc\u30ab\u30fc\u6570\n        $workersByCPU = $cpuCores * 2;\n\n        \/\/ \u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u3092\u8003\u616e\u3057\u305f\u30ef\u30fc\u30ab\u30fc\u6570\n        $workersByMemory = floor($availableMemory \/ ($averageJobMemory * 1.2));\n\n        \/\/ \u4f4e\u3044\u65b9\u306e\u5024\u3092\u63a1\u7528\n        return min($workersByCPU, $workersByMemory);\n    }\n\n    private function getAverageJobMemory()\n    {\n        return cache()-&gt;remember('avg_job_memory', 3600, function () {\n            return DB::table('job_metrics')\n                -&gt;where('created_at', '&gt;', now()-&gt;subDay())\n                -&gt;avg('memory_peak');\n        });\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-18\">\u30d0\u30c3\u30c1\u51e6\u7406\u306b\u3088\u308b\u52b9\u7387\u5316<\/h3>\n\n\n\n<p>\u5927\u91cf\u306e\u30b8\u30e7\u30d6\u3092\u52b9\u7387\u7684\u306b\u51e6\u7406\u3059\u308b\u305f\u3081\u306e\u30d0\u30c3\u30c1\u51e6\u7406\u306e\u5b9f\u88c5\u65b9\u6cd5\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30d0\u30c3\u30c1\u30b8\u30e7\u30d6\u306e\u57fa\u672c\u5b9f\u88c5<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class ImportProductsBatch implements ShouldQueue\n{\n    use Batchable;\n\n    protected $products;\n    protected $chunkSize = 1000;\n\n    public function __construct(Collection $products)\n    {\n        $this-&gt;products = $products;\n    }\n\n    public function handle()\n    {\n        \/\/ \u30c1\u30e3\u30f3\u30af\u5358\u4f4d\u3067\u306e\u51e6\u7406\n        $this-&gt;products-&gt;chunk($this-&gt;chunkSize)-&gt;each(function ($chunk) {\n            DB::transaction(function () use ($chunk) {\n                foreach ($chunk as $product) {\n                    Product::create($product);\n                }\n            });\n\n            \/\/ \u30e1\u30e2\u30ea\u89e3\u653e\n            gc_collect_cycles();\n        });\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>Bus Batch\u306e\u6d3b\u7528<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class ProductImportController\n{\n    public function import(Request $request)\n    {\n        $products = $this-&gt;parseProductsFile($request-&gt;file('products'));\n\n        $batch = Bus::batch([])\n            -&gt;then(function (Batch $batch) {\n                Log::info('All products imported successfully', [\n                    'total_jobs' =&gt; $batch-&gt;totalJobs,\n                    'execution_time' =&gt; $batch-&gt;finishedAt-&gt;diffInSeconds($batch-&gt;createdAt)\n                ]);\n            })\n            -&gt;catch(function (Batch $batch, \\Throwable $e) {\n                Log::error('Product import failed', [\n                    'failed_jobs' =&gt; $batch-&gt;failedJobs,\n                    'error' =&gt; $e-&gt;getMessage()\n                ]);\n            })\n            -&gt;finally(function (Batch $batch) {\n                \/\/ \u30af\u30ea\u30fc\u30f3\u30a2\u30c3\u30d7\u51e6\u7406\n                Cache::tags(['import'])-&gt;flush();\n            });\n\n        \/\/ \u30c1\u30e3\u30f3\u30af\u5358\u4f4d\u3067\u30b8\u30e7\u30d6\u3092\u8ffd\u52a0\n        $products-&gt;chunk(1000)-&gt;each(function ($chunk) use ($batch) {\n            $batch-&gt;add(new ImportProductsBatch($chunk));\n        });\n\n        return response()-&gt;json([\n            'batch_id' =&gt; $batch-&gt;id,\n            'total_jobs' =&gt; $batch-&gt;totalJobs\n        ]);\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-19\">\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u6700\u9069\u5316\u624b\u6cd5<\/h3>\n\n\n\n<p>\u30e1\u30e2\u30ea\u30ea\u30fc\u30af\u3092\u9632\u304e\u3001\u52b9\u7387\u7684\u306a\u30e1\u30e2\u30ea\u4f7f\u7528\u3092\u5b9f\u73fe\u3059\u308b\u305f\u3081\u306e\u624b\u6cd5\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u76e3\u8996\u3068\u6700\u9069\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class MemoryOptimizedJob implements ShouldQueue\n{\n    use InteractsWithQueue, Queueable;\n\n    protected $initialMemory;\n    protected $peakMemory;\n\n    public function handle()\n    {\n        $this-&gt;initialMemory = memory_get_usage();\n\n        try {\n            \/\/ \u5927\u91cf\u306e\u30c7\u30fc\u30bf\u3092\u51e6\u7406\n            $this-&gt;processLargeDataSet();\n\n            \/\/ \u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u3092\u30ed\u30b0\u306b\u8a18\u9332\n            $this-&gt;logMemoryUsage();\n\n        } finally {\n            \/\/ \u660e\u793a\u7684\u306a\u30e1\u30e2\u30ea\u89e3\u653e\n            $this-&gt;cleanupMemory();\n        }\n    }\n\n    protected function processLargeDataSet()\n    {\n        \/\/ \u30ab\u30fc\u30bd\u30eb\u3092\u4f7f\u7528\u3057\u3066\u5927\u91cf\u30c7\u30fc\u30bf\u3092\u52b9\u7387\u7684\u306b\u51e6\u7406\n        User::cursor()-&gt;each(function ($user) {\n            \/\/ \u30e6\u30fc\u30b6\u30fc\u3054\u3068\u306e\u51e6\u7406\n            $this-&gt;processUser($user);\n\n            \/\/ \u5b9a\u671f\u7684\u306a\u30e1\u30e2\u30ea\u89e3\u653e\n            if ($this-&gt;shouldCollectGarbage()) {\n                $this-&gt;collectGarbage();\n            }\n        });\n    }\n\n    protected function shouldCollectGarbage()\n    {\n        $currentMemory = memory_get_usage();\n        return $currentMemory &gt; $this-&gt;initialMemory * 1.5;\n    }\n\n    protected function collectGarbage()\n    {\n        gc_collect_cycles();\n        $this-&gt;peakMemory = max($this-&gt;peakMemory, memory_get_peak_usage());\n    }\n\n    protected function logMemoryUsage()\n    {\n        Log::info('Job memory usage', [\n            'initial_memory' =&gt; $this-&gt;formatMemory($this-&gt;initialMemory),\n            'peak_memory' =&gt; $this-&gt;formatMemory($this-&gt;peakMemory),\n            'final_memory' =&gt; $this-&gt;formatMemory(memory_get_usage())\n        ]);\n    }\n\n    protected function formatMemory($bytes)\n    {\n        return round($bytes \/ 1024 \/ 1024, 2) . 'MB';\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30e1\u30e2\u30ea\u52b9\u7387\u306e\u826f\u3044\u30c7\u30fc\u30bf\u51e6\u7406<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class ChunkedDataProcessor\n{\n    public function processLargeFile($filePath)\n    {\n        \/\/ \u30d5\u30a1\u30a4\u30eb\u3092\u5c11\u3057\u305a\u3064\u8aad\u307f\u8fbc\u3080\n        $handle = fopen($filePath, 'r');\n        $buffer = [];\n        $count = 0;\n\n        while (!feof($handle)) {\n            $line = fgets($handle);\n            $buffer[] = $this-&gt;processLine($line);\n            $count++;\n\n            \/\/ \u30d0\u30c3\u30d5\u30a1\u304c\u4e00\u5b9a\u30b5\u30a4\u30ba\u306b\u9054\u3057\u305f\u3089\u51e6\u7406\n            if ($count &gt;= 1000) {\n                $this-&gt;processBatch($buffer);\n                $buffer = [];\n                $count = 0;\n                gc_collect_cycles();\n            }\n        }\n\n        \/\/ \u6b8b\u308a\u306e\u30d0\u30c3\u30d5\u30a1\u3092\u51e6\u7406\n        if (!empty($buffer)) {\n            $this-&gt;processBatch($buffer);\n        }\n\n        fclose($handle);\n    }\n\n    protected function processBatch(array $batch)\n    {\n        \/\/ \u30d0\u30c3\u30c1\u51e6\u7406\u306e\u30ed\u30b8\u30c3\u30af\n        dispatch(new ProcessDataBatchJob($batch));\n    }\n}<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u30ea\u30bd\u30fc\u30b9\u7ba1\u7406\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class ResourceEfficientJob implements ShouldQueue\n{\n    public function handle()\n    {\n        \/\/ \u30e1\u30e2\u30ea\u5236\u9650\u306e\u8a2d\u5b9a\n        ini_set('memory_limit', '512M');\n\n        \/\/ \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u63a5\u7d9a\u306e\u6700\u9069\u5316\n        DB::connection()-&gt;unsetEventDispatcher();\n\n        \/\/ \u30af\u30a8\u30ea\u30ed\u30b0\u306e\u7121\u52b9\u5316\uff08\u672c\u756a\u74b0\u5883\uff09\n        if (app()-&gt;environment('production')) {\n            DB::disableQueryLog();\n        }\n\n        \/\/ \u5927\u304d\u306a\u30b3\u30ec\u30af\u30b7\u30e7\u30f3\u306e\u52b9\u7387\u7684\u306a\u51e6\u7406\n        $this-&gt;processLargeCollection();\n    }\n\n    protected function processLargeCollection()\n    {\n        $query = LargeModel::query();\n\n        \/\/ \u30c1\u30e3\u30f3\u30af\u51e6\u7406\u3067\u30e1\u30e2\u30ea\u4f7f\u7528\u3092\u6291\u5236\n        $query-&gt;chunk(1000, function ($records) {\n            foreach ($records as $record) {\n                \/\/ \u30ec\u30b3\u30fc\u30c9\u306e\u51e6\u7406\n                $this-&gt;processRecord($record);\n            }\n\n            \/\/ \u30c1\u30e3\u30f3\u30af\u51e6\u7406\u5f8c\u306e\u30af\u30ea\u30fc\u30f3\u30a2\u30c3\u30d7\n            DB::connection()-&gt;disconnect();\n            gc_collect_cycles();\n        });\n    }\n}<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u6700\u9069\u5316\u624b\u6cd5\u3092\u9069\u5207\u306b\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001\u52b9\u7387\u7684\u3067\u5b89\u5b9a\u3057\u305f\u30b8\u30e7\u30d6\u51e6\u7406\u30b7\u30b9\u30c6\u30e0\u3092\u69cb\u7bc9\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-20\">\u672c\u756a\u74b0\u5883\u3067\u306e\u904b\u7528\u3068\u30b9\u30b1\u30fc\u30ea\u30f3\u30b0<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-21\">Supervisor\u3092\u4f7f\u7528\u3057\u305f\u30d7\u30ed\u30bb\u30b9\u7ba1\u7406<\/h3>\n\n\n\n<p>\u672c\u756a\u74b0\u5883\u3067\u306e\u30b8\u30e7\u30d6\u30ef\u30fc\u30ab\u30fc\u3092\u5b89\u5b9a\u3057\u3066\u904b\u7528\u3059\u308b\u305f\u3081\u306b\u3001Supervisor\u306e\u9069\u5207\u306a\u8a2d\u5b9a\u304c\u91cd\u8981\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Supervisor\u306e\u57fa\u672c\u8a2d\u5b9a<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">[program:laravel-worker]\nprocess_name=%(program_name)s_%(process_num)02d\ncommand=php \/var\/www\/html\/artisan queue:work redis --sleep=3 --tries=3 --timeout=300\nautostart=true\nautorestart=true\nuser=www-data\nnumprocs=8\nredirect_stderr=true\nstdout_logfile=\/var\/log\/supervisor\/worker.log\nstopwaitsecs=300\n\n# \u8907\u6570\u30ad\u30e5\u30fc\u306e\u8a2d\u5b9a\u4f8b<\/pre>\n\n\n[program:high-priority-worker]\n\n\n\n<p>process_name=%(program_name)s_%(process_num)02d command=php \/var\/www\/html\/artisan queue:work redis \u2013queue=high \u2013sleep=3 numprocs=4<\/p>\n\n\n[program:default-worker]\n\n\n\n<p>process_name=%(program_name)s_%(process_num)02d command=php \/var\/www\/html\/artisan queue:work redis \u2013queue=default \u2013sleep=3 numprocs=6<\/p>\n\n\n[program:low-priority-worker]\n\n\n\n<p>process_name=%(program_name)s_%(process_num)02d command=php \/var\/www\/html\/artisan queue:work redis \u2013queue=low \u2013sleep=3 numprocs=2<\/p>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0\u30b9\u30af\u30ea\u30d7\u30c8\u306e\u5b9f\u88c5<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class SupervisorMonitor\n{\n    public function checkWorkers()\n    {\n        $output = shell_exec('supervisorctl status');\n        $workers = $this-&gt;parseWorkerStatus($output);\n\n        foreach ($workers as $worker) {\n            if ($worker['status'] !== 'RUNNING') {\n                $this-&gt;notifyAdministrator($worker);\n            }\n\n            \/\/ \u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u30c1\u30a7\u30c3\u30af\n            $this-&gt;checkWorkerMemory($worker['pid']);\n        }\n    }\n\n    protected function checkWorkerMemory($pid)\n    {\n        $memory = shell_exec(\"ps -o rss= -p {$pid}\");\n        $memoryMB = intval($memory) \/ 1024;\n\n        if ($memoryMB &gt; 256) { \/\/ 256MB\u4ee5\u4e0a\u4f7f\u7528\u3057\u3066\u3044\u308b\u5834\u5408\n            Log::warning(\"Worker memory usage high\", [\n                'pid' =&gt; $pid,\n                'memory_usage' =&gt; $memoryMB . 'MB'\n            ]);\n        }\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-22\">\u6c34\u5e73\u30b9\u30b1\u30fc\u30ea\u30f3\u30b0\u306e\u5b9f\u73fe\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u30b7\u30b9\u30c6\u30e0\u306e\u8ca0\u8377\u306b\u5fdc\u3058\u3066\u51e6\u7406\u80fd\u529b\u3092\u67d4\u8edf\u306b\u8abf\u6574\u3059\u308b\u65b9\u6cd5\u3092\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u52d5\u7684\u306a\u30ef\u30fc\u30ab\u30fc\u7ba1\u7406<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class QueueScaler\n{\n    protected $redis;\n    protected $supervisor;\n\n    public function __construct()\n    {\n        $this-&gt;redis = Redis::connection();\n        $this-&gt;supervisor = new SupervisorClient();\n    }\n\n    public function adjustWorkers()\n    {\n        $queueSize = $this-&gt;getQueueSize();\n        $currentWorkers = $this-&gt;getCurrentWorkers();\n\n        \/\/ \u30ad\u30e5\u30fc\u30b5\u30a4\u30ba\u306b\u57fa\u3065\u3044\u3066\u30ef\u30fc\u30ab\u30fc\u6570\u3092\u8abf\u6574\n        $optimalWorkers = $this-&gt;calculateOptimalWorkers($queueSize);\n\n        if ($optimalWorkers !== $currentWorkers) {\n            $this-&gt;updateWorkerCount($optimalWorkers);\n        }\n    }\n\n    protected function calculateOptimalWorkers($queueSize)\n    {\n        \/\/ \u57fa\u672c\u7684\u306a\u8a08\u7b97\u30ed\u30b8\u30c3\u30af\n        $baseWorkers = 4;\n        $workersPerThousandJobs = 2;\n\n        $optimal = $baseWorkers + floor($queueSize \/ 1000) * $workersPerThousandJobs;\n\n        \/\/ \u4e0a\u9650\u3068\u4e0b\u9650\u306e\u8a2d\u5b9a\n        return min(max($optimal, 2), 16);\n    }\n\n    protected function updateWorkerCount($count)\n    {\n        $command = \"supervisorctl update &amp;&amp; \";\n        $command .= \"supervisorctl start laravel-worker:* &amp;&amp; \";\n        $command .= \"supervisorctl status\";\n\n        exec($command, $output);\n\n        Log::info('Worker count updated', [\n            'new_count' =&gt; $count,\n            'supervisor_output' =&gt; $output\n        ]);\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u8ca0\u8377\u5206\u6563\u306e\u8a2d\u5b9a<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ config\/horizon.php\nreturn [\n    'environments' =&gt; [\n        'production' =&gt; [\n            'supervisor-1' =&gt; [\n                'connection' =&gt; 'redis',\n                'queue' =&gt; ['high', 'default'],\n                'balance' =&gt; 'simple',\n                'processes' =&gt; 10,\n                'tries' =&gt; 3,\n            ],\n            'supervisor-2' =&gt; [\n                'connection' =&gt; 'redis',\n                'queue' =&gt; ['low'],\n                'balance' =&gt; 'auto',\n                'processes' =&gt; 5,\n                'tries' =&gt; 1,\n            ],\n        ],\n    ],\n];<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-23\">\u969c\u5bb3\u767a\u751f\u6642\u306e\u5bfe\u5fdc\u624b\u9806<\/h3>\n\n\n\n<p>\u30b7\u30b9\u30c6\u30e0\u306e\u5b89\u5b9a\u6027\u3092\u7dad\u6301\u3059\u308b\u305f\u3081\u306e\u969c\u5bb3\u5bfe\u5fdc\u30d7\u30ed\u30bb\u30b9\u3092\u8aac\u660e\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u969c\u5bb3\u691c\u77e5\u3068\u81ea\u52d5\u5fa9\u65e7<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class JobFailureHandler\n{\n    public function handle($event)\n    {\n        $job = $event-&gt;job;\n        $exception = $event-&gt;exception;\n\n        \/\/ \u969c\u5bb3\u60c5\u5831\u306e\u8a18\u9332\n        $this-&gt;logFailure($job, $exception);\n\n        \/\/ \u91cd\u5927\u5ea6\u306e\u5224\u5b9a\n        if ($this-&gt;isCriticalFailure($exception)) {\n            $this-&gt;handleCriticalFailure($job, $exception);\n        } else {\n            $this-&gt;handleNormalFailure($job, $exception);\n        }\n    }\n\n    protected function handleCriticalFailure($job, $exception)\n    {\n        \/\/ \u7ba1\u7406\u8005\u3078\u306e\u901a\u77e5\n        Notification::route('slack', config('notifications.slack_webhook'))\n            -&gt;notify(new CriticalJobFailureNotification($job, $exception));\n\n        \/\/ \u30ef\u30fc\u30ab\u30fc\u306e\u518d\u8d77\u52d5\u304c\u5fc5\u8981\u304b\u5224\u65ad\n        if ($this-&gt;shouldRestartWorker($exception)) {\n            $this-&gt;restartWorker($job-&gt;getConnectionName());\n        }\n\n        \/\/ \u95a2\u9023\u30b8\u30e7\u30d6\u306e\u4e00\u6642\u505c\u6b62\n        $this-&gt;pauseRelatedJobs($job);\n    }\n\n    protected function pauseRelatedJobs($job)\n    {\n        \/\/ \u540c\u3058\u30bf\u30a4\u30d7\u306e\u30b8\u30e7\u30d6\u3092\u4e00\u6642\u7684\u306b\u505c\u6b62\n        Redis::set('pause_jobs:' . $job-&gt;getConnectionName(), true, 'EX', 300);\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u5fa9\u65e7\u624b\u9806\u306e\u81ea\u52d5\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class RecoveryManager\n{\n    public function executeRecoveryProcedure()\n    {\n        \/\/ 1. \u5931\u6557\u3057\u305f\u30b8\u30e7\u30d6\u306e\u5206\u6790\n        $failedJobs = $this-&gt;analyzeFailedJobs();\n\n        \/\/ 2. \u30ea\u30ab\u30d0\u30ea\u30fc\u53ef\u80fd\u306a\u30b8\u30e7\u30d6\u306e\u9078\u5225\n        $recoverableJobs = $this-&gt;filterRecoverableJobs($failedJobs);\n\n        \/\/ 3. \u30b8\u30e7\u30d6\u306e\u518d\u5b9f\u884c\n        foreach ($recoverableJobs as $job) {\n            $this-&gt;retryJob($job);\n        }\n\n        \/\/ 4. \u30b7\u30b9\u30c6\u30e0\u72b6\u614b\u306e\u78ba\u8a8d\n        $this-&gt;verifySystemState();\n    }\n\n    protected function retryJob($job)\n    {\n        try {\n            Artisan::call('queue:retry', ['id' =&gt; $job-&gt;id]);\n\n            Log::info('Job recovered successfully', [\n                'job_id' =&gt; $job-&gt;id,\n                'queue' =&gt; $job-&gt;queue\n            ]);\n\n        } catch (\\Exception $e) {\n            Log::error('Recovery failed', [\n                'job_id' =&gt; $job-&gt;id,\n                'error' =&gt; $e-&gt;getMessage()\n            ]);\n        }\n    }\n\n    protected function verifySystemState()\n    {\n        \/\/ \u30ad\u30e5\u30fc\u306e\u5065\u5168\u6027\u30c1\u30a7\u30c3\u30af\n        $queueHealth = $this-&gt;checkQueueHealth();\n\n        \/\/ \u30ef\u30fc\u30ab\u30fc\u306e\u72b6\u614b\u78ba\u8a8d\n        $workerHealth = $this-&gt;checkWorkerHealth();\n\n        \/\/ \u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u78ba\u8a8d\n        $memoryHealth = $this-&gt;checkMemoryUsage();\n\n        if (!$queueHealth || !$workerHealth || !$memoryHealth) {\n            $this-&gt;notifySystemUnhealthy([\n                'queue_health' =&gt; $queueHealth,\n                'worker_health' =&gt; $workerHealth,\n                'memory_health' =&gt; $memoryHealth\n            ]);\n        }\n    }\n}<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u5b9f\u88c5\u306b\u3088\u308a\u3001\u672c\u756a\u74b0\u5883\u3067\u306e\u5b89\u5b9a\u3057\u305f\u904b\u7528\u3068\u30b9\u30b1\u30fc\u30e9\u30d3\u30ea\u30c6\u30a3\u3092\u78ba\u4fdd\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u30b7\u30b9\u30c6\u30e0\u306e\u898f\u6a21\u3084\u8981\u4ef6\u306b\u5fdc\u3058\u3066\u3001\u3053\u308c\u3089\u306e\u8a2d\u5b9a\u3092\u9069\u5207\u306b\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Warning: Undefined array key &#8220;is_admin&#8221; in \/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/ &#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12],"tags":[],"class_list":{"0":"post-2626","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-php","7":"nothumb"},"_links":{"self":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/2626","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2626"}],"version-history":[{"count":2,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/2626\/revisions"}],"predecessor-version":[{"id":2628,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/2626\/revisions\/2628"}],"wp:attachment":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2626"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2626"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2626"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}