私は今朝、私のWordpressサイトが自動的に最新版に更新されたという電子メールを受け取りました。私はその機能について知っていましたが、私はいつもそれがどのように機能するのか正確に疑問に思いました。
PHPは恒久的に実行されるプロセスではありません。要求された場合にのみ実行されます。私が言うことができる限りでは、Wordpressは誰かがWebページをロードしたときにのみ自分自身を更新することができます。しかし、更新プロセスは瞬時には行われないため、サイトにアクセスしているユーザーのページロードが非常に遅くなる可能性があります。
自動更新に使用する別のトリックはありますか?私はあちこちを捜しましたが、少しの説明も見つけませんでした。
PHPは恒久的に実行されるプロセスではありません。要求された場合にのみ実行されます。私が言うことができる限りでは、Wordpressは誰かがWebページをロードしたときにのみ自分自身を更新することができます。しかし、更新プロセスは瞬時には行われないため、サイトにアクセスしているユーザーのページロードが非常に遅くなる可能性があります。
自動更新に使用する別のトリックはありますか?私はあちこちを捜しましたが、少しの説明も見つけませんでした。
あなたがここで探しているシステムは "WP Cron"と呼ばれています。 WordPressのバックグラウンドプロセスシステムで、通常の処理の外でイベントを発生させることができます。彼らはまだそれらをキックオフするトリガーを必要としますが、それらはバックグラウンドプロセスのためにページロードを妨げません。
そう、はい、誰かがあなたのページをロードしなければなりません。 default-filters.phpファイルでは、このコード行が見つかります。
add_action( 'init', 'wp_cron' );
そのため、ページが読み込まれるたびに、wp_cron関数が実行されます。この機能はwp-includes/cron.phpでは終わっていて、データベースでスケジュールされたイベントをチェックすることです。バックグラウンドで実行する必要があるプロセスがある場合は、関数spawn_cronを呼び出します。
Spawn cronには2つの操作方法がありますが、最初の最も一般的な方法は、wp-cron.phpのURLでwp_remote_post関数を呼び出してそれ自体に接続を戻すことです。この追加のHTTPリクエストを作成することで、実際のすべての作業を行うために別のPHPプロセスが開始されます。ここで行うリクエストは、0.01秒のタイムアウトで、ノンブロッキングです。そのため、ここでは実際に結果は得られません。リクエストの目的は、単にバックグラウンドで新しいプロセスを開始することです。これが行われた後、それは単に戻るので、視聴中のユーザーは遅延を持ちません。
Wp-cron.phpプロセスは、実際の作業、更新、およびその他すべての処理を行います。 WordPressの多くのプロセスはcronシステムによって処理されます。スケジュールされたポストパブリッシング、pingの処理、アップデートチェックなど、通常のフロー以外で発生する必要があるものはすべてスケジュールしてから必要に応じて実行できます。
しかし、はい、サイトへの通常のヒットは確かにプロセスを開始するために起こるに違いありません。いいえ、WordPress.orgは直接あなたのサイトに連絡を取って物事を始めるわけではありません。あなたのサイトはそれを始めるために何らかの形のトラフィックを受け取らなければなりません。どんな形のトラフィックでも構いません。
実際には、自動更新はwp.org
からプッシュされます。更新プロセスはあなたのサイトではまだ実行されていますが、バックグラウンドでwp-cron
を介して実行されます。
新しいマイナーアップデートがリリースされると、WordPressの担当者はそのアップデートを公開し始めます。 実際の更新プロセスはあなたのサイトが更新のためにwp.org
をチェックした後に開始され、更新は理論的に利用可能であり、そしてあなたのサイトは更新されるようにランダムに選ばれます。
(私の間違った言い回しを指摘してくれてありがとう@otto :))
すべてのサイトがwp.org
で新しいバージョンをチェックするので(通常はwp-cron
を使用して1日に2回)、ロールアウトサーバーは更新が必要なサイトの数を認識します。
その後、ロールアウトが始まり、ゆっくりと開始されます。128サイト中1サイトが自動的に更新されます。これは監視されており、成功がロールアウトに問題がないことを示している場合、すべての自動更新が配信されるまで、より多くのサイトが自動更新を取得します(通常、次の手順は64のうち1)。
これにより、問題が発生した場合に開発者がロールアウトを中止することができますが、最後の3.8
から3.8.1
への更新は100%の成功率を達成しました。
1 out of 128
によって選択されたサイトは実際にはランダムです。そうではありませんが、知りたい場合は、次のように機能します。
更新が必要なサイトのURLは、MD5
を使ってハッシュされます。このハッシュの最初の3文字だけを使用してそれをbase10
に変換すると、4096の可能性があります。更新は、0から31までの計算数を持つサイト(4096/32 = 128)で開始されました。
さて、私はそれは結局かなりランダムだと思います;)
私の場合は、私が多くのWordPressサイトを運営しているので、更新に1日かかりました - すべてのページが更新されたときに見るのはとても面白かったです。
念のためにあなたが疑問に思っていた:D
ところで、 ここ はmake.wordpress.orgの記事で、その過程を説明しています。
非常に広い意味では、ユーザーがサイトにアクセスするとwordpressはタイマーの有効期限をチェックし、有効期限が検出されると期限切れのイベントに関連するアクションを「実行」するためにanotherリクエストがサーバーに送信されます。これが、サーバーが実際のアクション(この場合はアップグレード)を別のプロセスで実行しているため、ユーザーがページの読み込みに著しい遅れを感じない理由です。
これはうまくいきますが、タイミングはあまり正確ではありません。サイトのトラフィックが多いほど、正確になります。
より良いパフォーマンスとより正確なタイミングを得たい人は、ワードプレスの内部cron「プロセス」をブロックし、タイマーのチェックをトリガーするためにOS cronプロセスを使用することができます。