新規記事の投稿を行うことで、非表示にすることが可能です。
PHP5で動く、PHP7なんか動きが違う、原因は何?どこをチェックするのがいい?
PHP5.6では、思い通り、設計通りの動作をしていたプログラムがありました。
このプログラムは、macOSで動かしていて、先日macOSをSierraからHigh Sierraにアップグレードしました。
macOS Sierraは、PHP5.6系です。macOS High Sierraは、PHP7.1系がすぐに使える状態で入っています。
この違いは、プログラムの結果が求めている動作をしていないことで初めて知りました。
PHPのマイグレーションをページに新機能、新しい関数、下位互換性のない変更点、推奨されなくなる機能、変更された関数、その他の変更など、PHPのバージョンをあげる前に注意するべきポイントがまとまっているので参考にしています。
メニューから各バージョンのマイグレーションを選択することができます。
参考:PHP7.0.xからPHP7.1.xへの移行
今回、発生した問題は、この移行ページに掲載されていました。
PHP 7.0.x から PHP 7.1.x への移行>変更された関数 >ファイルシステム
file_get_contents() now accepts a negative seek offset if the stream is seekable.
さらりと1行でまとまっています。
file_get_contents関数はファイルを読み込んだり、URLからWEBページを取得できるよく使われる関数の一つです。
PHP5のfile_get_contents関数の説明はこんな感じでした。
それが、PHP7.1の変更後、このように変わっていました。
違いわかるでしょうか?そうです!$offsetのデフォルト値が-1から0に変わっています。マニュアル上はこのように変わっていますが、PHP5.6はいままで通り-1を渡しても0と同じ意味です。
一方、$offsetに-1を渡すようなプログラムをPHP7.1以降で動かすと、 ストリームの末尾からのオフセットと解釈されます。
=>PHP5で動く、PHP7.1で動きがおかしい原因はこれでした。
関数のデフォルト値って不変、ずっと変わらないものって思い込んでいました。現実は、バージョンアップで変わることがあるってことです。ファイル名以外、引数を指定することがないって方も多いかと思います。
作り込んだライブラリで、拡張性を持たせるためにPHPのデフォルト引数も全て受け付けるようなラッパー関数、ヘルパー関数はPHPのデフォルト値を自作関数、メソッドの引数にコーディングすることが多いです。
PHP5で動いていたものがPHP7で動かなくなったら、チェックすべきポイント
PHPのマイグレーションには、たった1行の変更点の記載でしたが、インパクトが大きいってことがわかったかと思います。
自作関数、自作メソッドでPHPのデフォルトを書いているところは、マニュアルを参考にし、再確認するのが良いかと思います。
この際、マイグレーションページを見ながら、記載のある関数を使っているかgrepやIDEの検索機能をフルに使ってチェックするのが効率的です。
=>マイグレーションページをインデックスにし、関数のマニュアルとソースを比較!
まとめ
繰り返しになりますが、PHP5とPHP7の違いは、ワードプレスを使っている限りほとんど意識することはありません。今回のfile_get_contentsに関しても完全互換性があり、ファイル名のみの指定で使っていると同一です。でもデフォルト引数の違いがありましたね。拡張性を考えたメソッドやヘルパ関数は標準と同じような引数を許可するような設計はこういった変更のインパクトが大きいって思いましたよ。
0と-1で別物の動きになってしまいますから・・・
-
no image
-
no image
-
no image
-
no image
-
no image
PHP string streamのやり方
実際のやり方は以下PHPソースコードの通りです。$txtはStringストリームとして扱いたいテキストを指定します。file_get_contentsで読み込んだテキストでもOKです。ここではヒアドキュメント形式で設定しています。テキストファイルから読み込む場合は、改行コードの違いに注意してくださいね。
<?php
$txt = <<< EOM
1行目
2行目テキスト
3行目文字列
4行目文字列
EOM;
foreach( explode( PHP_EOL, $txt) as $row=>$line ){
// $rowは0から始まる番号です。
// $lineは1行ずつ文字列が入ってきます。
}
読み込んだテキストを改行で区切り、配列に格納しています。ここでは変数に入れることなく、直にforeachで回しています。
これでテキストをStringストリームのように1行ずつ処理することが可能になります。$rowは配列の添え字なので0から始まることに注意してください。行番号ではないですよ。
PHP_EOLは、行末文字です。WindowsならWIndowsの改行コード、Unix系ならUnix系の改行コードを意味しています。
お名前コムで取得したドメインをさくらサーバーで使う、戻す方法
さくらサーバーのスタンダードは、初期ドメイン(sakura.ne.jpのサブドメイン)の他に2つまで無料のサブドメインを取得して使うことができます。独自ドメインも契約できます。GMO系列に比べると価格が少しお高めなのでお名前コム、バリュードメインなどで取得することが多いです。
ドメインは移管するの?
お名前コムで取得したドメインを他社レンタルサーバーで利用したい用途なら移管する必要はないです。
レジストラーが提供するWebの機能に不満がある、そういった方は気に入ったレジストラーへ移管することで幸せになれますね。
ここでは、ドメインを移管しない方法をご紹介しています。移管したい方はこのページで悩みを解決できません。
お名前コムで取得したドメインをさくらサーバーで使う流れ
すでにお名前コムを使ってドメインを取得した、これからドメインを取得する方どちらの方もこの流れで対応できます。
お名前コムで取得したドメインは、ドメインNaviを使います。
ドメインNavi(https://www.onamae.com/domain/navi/domain)にログインすると取得済みドメインの一覧が表示されます。表は、ドメイン名、更新期限日、契約更新、サーバー申込み、Whois情報公開代行、ネームサーバーなどが表示されています。
この表にある、ネームサーバー、これが今回使う機能になります。
ネームサーバー列の「変更する」ボタンをクリックすると「ネームサーバーの変更」画面に表示が切り替わります。「ご登録情報に変更・相違はありませんか?」というメッセージが表示される方もいるかもしれません。変更がないようでしたら「情報は正しいので、手続きを進める」ボタンをクリックします。
お名前.com各サービスを利用、他のネームサーバーを利用、2つのタブが表示されていますよね。
さくらレンタルサーバーで取得したドメインを使うためには、「他のネームサーバーを利用」をクリックします。
ネームサーバー情報を入力で1プライマリーネームサーバー(必須)、2セカンダリーネームサーバー(必須)、3、4、5の入力項目が表示されていることを確認してください。
まだ確認画面へ進むボタンは押しません。ここまでで1つ目の変更の準備が整いました。
さくらレンタルサーバーの管理画面から新しいドメインを追加します
さくらレンタルサーバーの管理画面から新しいドメインを追加する方法は、さくらサポート情報【ドメイン設定】他社で取得・管理中のドメインを利用を参照してください。
スクリーンショット付きで詳しく書いていあります。
「STEP4 ネームサーバの変更」でネームサーバー1 ns1.dns.ne.jp、ネームサーバー2 ns2.dns.ne.jpを指定します。ここで先ほどログインしたドメインNaviを利用します。
1プライマリーネームサーバーへ「ns1.dns.ne.jp」、2セカンダリーネームサーバー「ns2.dns.ne.jp」を入力し、確認画面へ進むボタンを押して、確認後確定します。
しばらく待つと切り替わってさくらインターネットで設定したサイトにアクセスできるようになります。
インターネットの環境によっては、反映完了まで24時間から72時間程度かかる場合があります。本当?
「インターネットの環境によっては、反映完了まで24時間から72時間程度かかる場合があります」を目にしたことがあります。さくらインターネットのコントロールパネルでドメインを追加、お名前コムでネームサーバーを切り替える、たったこれしかしていないのに、24時間から72時間程度かかるって本当でしょうか?って疑問ですよね。
ある意味本当です。
注目したいのは「インターネットの環境によっては、」という箇所です。
ネームサーバーとは
ネームサーバーは、ドメイン名とIPアドレスの対応を管理してくれるサーバーです。このサーバーではドメインネームサービス(DNS)が動作しています。これが本当に管理してくれる実態です。
ネームサーバーは全世界に至るところに存在します。メインとなるネームサーバーもあります。ルートネームサーバとも呼ばれます。
DNSと聞くと、ドメイン名で問い合わせるとIPアドレスがわかったり、IPアドレスで問い合わせるとドメイン名がわかるものというイメージかもしれません。これ以外にDNSはドメイン名、IPアドレスのデータを動的、静的に管理する仕組みがあります。
DNSサーバーに未登録のドメインは、DNSサーバーがより上位のDNSサーバーに問い合わせて解決しようとします。ここで得た情報は、ある一定期間DNSサーバー内にキャッシュされ活用されます。
このキャッシュされる時間は、DNSサーバーの設定に依存します。古くからの慣例で1日としているサーバーが多いです。
=>キャッシュが短いDNSサーバーは素早く反映されます。
会社からインターネットにアクセスする際は、会社で立ち上げているDNSサーバーを経由してアドレスを特定しています。家庭からインターネットにアクセスする場合は、プロバイダーが提供しているDNSサーバーを経由してアドレスを特定しています。DNSサーバーはいたるところで立ち上がっています。同じようにキャッシュされる仕組みです。キャッシュする設定はサーバーに依存します。
=>インターネット環境とは、どちらかというと自身がアクセスするインターネット環境という意味合いが強いです。
さくらサーバーからお名前コムに戻す
さくらインターネットのスタンダードプランで使っているドメインをお名前コムに戻して、さくらサーバー以外で利用したい場合がありました。ここではその時行った手順をまとめています。元に戻すドメインはサブドメイン利用していないドメインです。
お名前コムで取得したドメインをさくらインターネットで使う場合、さくらインターネットのコントロールパネルでドメインを新規追加、お名前コムでネームサーバーをdns.ne.jpに切り替える流れでしたね。
この逆順が正解だと思っています。さくらインターネットから削除する際、そのサイトを削除する操作になります。バックアップが必要な方は事前に実施しておく必要があります。また、「共有SSL」 「SNI SSL」 「Webアプリケーションファイアウォール」の設定をしたまま削除はできません。解除方法はこちらでわかります。
1 ドメインNaviへアクセスし、ネームサーバーを初期設定します
「お名前.com各サービスを利用」タブにある初期設定に戻す「設定する」ボタンをクリックします。
「ネームサーバーの変更 確認」画面で対象ドメインが戻したいドメインになっていることを確認します。ネームサーバー情報には、お名前コムのドメインが表示されています。よければ「設定する」ボタンをクリックします。
2 ドメインがお名前コムに移るまで待ちます。
待ちます。
ブラウザからアクセスし、このドメインはお名前コムで管理されていますと表示されるまで待ちます。
3 さくらインターネットのコントロールパネルからサイト(ドメイン)を削除します
ドメイン設定 ドメイン/SSL設定を開いて、削除ボタンをクリックします。ドメインの削除 確認画面に移ります。削除ドメイン名がお名前コムで初期化したドメインであることをしっかり確認し、「送信」ボタンをクリックします。
間違って削除すると2時間は戻すことができません。
ワードプレスのデータベースなどもがっつり削除されるので間違えないようにしてくださいね。
3、1の順番でもうまくいくかもしれません。初期設定した逆順が安心ですよ。
まとめ
お名前コムで取得したドメインをさくらサーバーで使う、戻す方法をご紹介してきました。使う方法はよく目にします、戻す方法を目にする機会がないので記事にしてみました。
お使いのDNSサーバーのキャッシュ設定を確認したい場合、digというコマンドを利用するのが一般的です。
Windowsではnslookupコマンドを使います。
コマンドプロンプト> nslookup
> set debug
> 確認したいドメイン
----
権限のない回答
----
ここにttlまたは default TTLがキャッシュ設定になります。
TTLは秒で示されることが多いです。2774と表示されていたら46分14秒という意味になります。
HTMLを更新後、表示が変更前のままです。コレで直ります【エックスサーバー】
HTMLを更新後、表示が変更前のままです。コレで直ります【エックスサーバー】
エックスサーバーは、PHPの初回実行時に、PHPの内容を最適化した状態でキャッシュしておき、次回以降、 同じPHPにアクセスがあった際にキャッシュしたPHPで高速になる機能が標準装備されています。(APC / OPcache)
コンパイル済みPHPプログラムをメモリに格納して、メモリ上のプログラムを再利用しています。
PHPプログラムから読むテキストファイルに変更を加えても、サイトの表示は変更前のままでした。
利用しているとプログラムの実行結果もキャッシュされていると感じることが多いです。
また、「mod_pagespeed設定」を有効にすると、ファイルを圧縮してデータ転送量を削減する、同種のファイルを一まとめにして無駄な通信を削減するなどの最適化処理を実行しています。
今このmod_pagespeedはOFFの設定でも、表示が修正前のままの状態になっています
HTMLテキストファイルを更新し、表示が反映されないのは、キャッシュが原因です。
キャッシュをクリアするには、PHPファイルの日付を最新にするのが最も簡単な方法です。
以下、sshでxserverにログインして、PHPファイルの日付を更新する方法です。
cd ドメイン/public_html/
(ドメインの公開フォルダに移動します。)
ls *.php
(PHPファイルの一覧を表示させます。)
目的のファイルの日付を更新します。
touch php-file-name.php
touchコマンドは、存在するファイルの日付を最新にします。
ファイルが存在しない場合、新規作成してしまうので、打ち間違いに注意してください。
間違ってファイルを作ってしまったら、以下コマンドで消すことができます。
rm -i 間違って作ってしまったファイル名
-iパラメーターを指定することで確認メッセージが表示されます。
これで、ブラウザで表示を更新すると最新の内容に反映されたことが確認できます。
もし、直っていない方は、更新すべきphpファイルを間違えている可能性があります。
.htaccessでRewriteしている場合、index.phpも合わせてtouchしてみると直る可能性があります。
AMP対応ページは、別ドメインでも公開可能だが、警告が出る
具体的には、無料ブログのheadに<link ref="amphtml" href=https://"独自ドメイン/..."/>を追加して、独自ドメイン(HTTPS)のAMPページへ飛ばしています。
Google Search Console
無料ブログ(PC向けサイト)、独自ドメイン(AMPサイト)共にGoogle Search Console、Google アナリティクスに登録しています。
Google Search Consoleの検索での見え方からAccelerated Mobile Pagesのインデックスに登録された AMP ページ数や重大な問題のある AMP ページを知ることができます。
Accelerated Mobile Pages(検索での見え方)はPCサイト(無料ブログ)で確認できます
PCサイトからAMPサイトへリンクを貼ってしばらく経つと、PCサイトのサーチコンソールに「新しい重要メッセージ」が届きます。
PCサイトURLのAMPドメインの更新というタイトルでした。
独自ドメイン側に出てくるかと思っていましたが、1週間経っても「Accelerated Mobile Pages は見つかりませんでした」のまま。きっとこっちには登録されませんね。
無料ブログ(PC向けサイト):Accelerated Mobile Pagesのインデックス状況が表示されます。
独自ドメイン(AMPサイト):表示されません。「サイトにAccelerated Mobile Pages は見つかりませんでした」
警告が表示されます。Accelerated Mobile Pages > AMP ページのドメイン不一致(問題の重大性: 重要ではない問題)
AMP ページをホストしているドメインが正規ページのドメインと異なると、AMP ビューアでユーザーの混乱を招く恐れがあります。
この先ドメインを統合するまで、ずっとこの警告が表示され続けることになります。
検索アナリティクス(検索トラフィック)
検索での見え方は、独自ドメイン(AMPページ)で選択できます。
通常、同一ドメインでAMP対応した場合、検索トラフィック>検索アナリティクスのフィルタ項目に「検索での見え方」が追加選択できるようになります。フィルタなし、AMPなどが選べますよね
無料ブログ(PC向けサイト):「検索での見え方」フィルタはありません。
独自ドメイン(AMPサイト):「検索での見え方」があります。
Google Search Consoleの別ドメイン AMPページのまとめ
ここまでのまとめてとして、別ドメインでAMPページを公開すると以下のようになります。
- AMP ページのドメイン不一致警告が表示される
- Accelerated Mobile Pagesインデックス状況は、PC向けサイト
- AMPのクエリ、ページのCTR、掲載順位は、AMPサイト
続いては、Googleの検索結果です。
Googleの検索結果
別ドメインでAMPページを公開し、Accelerated Mobile Pagesで重大なエラーがないページは稲妻マークのAMPページとして検索結果に表示されます。
PCブラウザの検索結果タイトル | スマホブラウザの検索結果タイトル |
PCブラウザの検索結果はPCサイトのURLをナビゲートしていました。
一方スマホブラウザの検索結果は、見た目PCサイトのURLですが、AMPサイトが表示されます。
iPad Proで検索した結果、AMPサイトが表示されました。
AMPページ対応することで、いままで通りパソコンのブラウザで検索した訪問者をPCサイトへ流せます。
タブレット、スマホのブラウザで検索した訪問者をAMPサイトへ流すことができます。
検索結果をクリックした後、AMPサイトが表示されたタイミングで初めてドメインが違うことがわかる仕組みでした。そのため、Googleは別ドメインで実装したAMPページに警告を表示しているんですね。
database is lockedに悩んだら、コレで解決!原因は予想外のコイツ!でした
SQLite3データベースをunlockする方法
ここではロックされているデータベースをdb.sqlite3としています。アンロックする方法自体はとても簡単でした。リモートログインしてshell操作する必要があります。FTPでも同様のことができるかもしれませんが、ここでは試していないのです。
移動して、コピーすることで、unlockできました。
1. mv db.sqlite3 bk.db.sqlite3
ロックされているSQLite3のデータベースファイルを別名にします。(mv)
2. cp -p bk.db.sqlite3 db.sqlite3
元と同じファイル日付で、元と同じファイル名としてコピーします。(cp -p)
たったこれだけの操作で悩み悩んだdatabase is lockedが回避できました。
ファイルを別名し、コピーすることでロックが解除できます。
sqlite3データベースにロック情報が記録されているのであれば、この操作では中身を一切書き換えていないので、アンロックされることはあり得ません。
このことからロックの原因は、PHPのSQLite3 拡張モジュールで使われているflock系のシステムコールに起因すると想像しています。
database is lockedが発生した真の理由
SQLite3データベースをunlockする方法にflock系のシステムコールがロックの原因と書きました。これは誰かがflockしているからdatabase is lockedが発生してしまうことになります。では、誰が一体flockをやっているのか?遅延書き込みなどの要因?
疑問でしたが、ようやくわかりました。まず以下のような設計でクーロン実行させています。
- 1)プログラムはPHPで作っています。クーロン実行させています。
- 2)エックスサーバーのクーロンは、1回で動作できる時間が30秒までの制限があります。
制限に達するとこのようなPHP Fatal error: Maximum execution time of 30 seconds exceededエラーメッセージとともに強制終了されます。 - 3)PHPプログラムは、SQLite3データベースに同時にアクセスしない設計になっています。そのタイミングでCRUDを行うのは1つのプログラムだけです
このような状況下で、database is lockedが発生しました。SQLite3データベースをunlockする方法で解決しますがロックさせてしまう根本的な対処にはなっていないですよね。
プログラムの設計上、シングルで動作しているのでロックされること自体ありえないって思っていました。原因は、プログラムの重複実行でした(笑)
予想外です。まさかの自分自身のプログラムがdatabase is lockedの要因を作っているなんて・・・
ただ、これ自分でプログラムを複数実行しているわけではないです。スケジュール実行で自動実行されています。今回対象のプログラムは30秒以上動作することがあるのでMaximum execution timeになり、プログラムが強制終了していたはずなのですが。。。どうやら生き残る生命力豊かなたくましい奴がたまに誕生するようです。
1)Maximum execution timeになる処理はデータベースの更新を含んでいるのでタイミングが悪いとトランザクションでロックした状態になりえます。
2)そのため次のスケジュール実行で動いたクーロンプログラムがdatabase is lockedで失敗する
この流れでdatabase is lockedが発生していたと確信しています。
根本的な原因はクーロンが生き残ることがあるということでしたね。あとはこれに対応できるようにプログラムを変えるだけです。例えば29秒経過したら自発的に正常終了させる、クーロン実行されたプログラムのPIDを記録して、killするようにする、ロックの回避方法はわかっているのでロックが発生したらロックの回避方法を試すなどのことをやればdatabase is lockedを撲滅できそうです!
ロックされている?データベースロックの確認方法
database is lockedエラーが発生した、1つのSQLite3データベースだけ扱っていればロックされたデータベースの特定は簡単ですよね。複数のSQLite3データベースがあるとどれ?これ?どうやって調べるの?となります。どうしたら単純に調べられるのか、コマンドを色々試して見つけたのがこの方法です。
この方法は、リモートログインして確認します。
シェルからsqlite3コマンドでSQLite3データベースファイルに対してVACUUMコマンドを実行する方法です。
$ sqlite3 データベース "vacuum;"
lockedの状態のデータベースファイルは、このコマンドを拒否します。
SQL error: database is locked
というメッセージが出力されます。
問題なければ、VACUUMにより空き領域が解放されます。データベースサイズが膨れていくので定期的にVACUUMコマンドを実行するのが良いとされていますよ。一石二鳥の確認方法ですね!
1つ注意点があって、他のプログラムやPHPからアクセス中にはやらない!ってことです。やっても良いですが失敗する可能性があるのと、参照している側もそのタイミングにアクセスすることでCRUDが失敗する恐れもあります。そのため、アクセスが少ない時にやったほうが良さそうです。
ちなみにCRUDは、Create/Read(select)/Update/Deleteのデータベース操作を示しす用語です。
まとめ
いかがでしたでしょうか?ここまでSQLite3データベースをunlockする方法、database is lockedが発生した真の理由、ロックされている?データベースロックの確認方法をご紹介してきました。
database is lockedは回避できましたでしょうか。
今回ご紹介したこの方法で私は回避できました。たまに間違えるのですが、mvは重要です。消すのは怖いからと代わりにcpでやると解決できません。lockの状態を継続しますよ。必ず元あったデータベースファイルの存在を消す!ってことが重要です
参考までに、この現象は、xserverで遭遇しました。
SQLite3のバージョンは、SQLite version 3.3.6です。
PHPのバージョンは、7.0.16です。
エックスサーバーで30秒以上のCronを上手に運用する3つのコツ
お好みのプログラムを10分毎に処理を実行させたり、毎日決まった時間に実行させることができます。
cronが使えるレンタルサーバーは、さくらレンタルサーバー、ロリポップ!などcron レンタルサーバーで探すことで対応しているレンタルサーバーが見つかります。
登録できるスケジュールの数、動いたスケジュールの稼働時間など何かしらのリミットがもうけられています。エックサーバーの場合は、CPUを100%使って良い時間に制限があります。
1回の実行で許容されるCPUフルの時間が30秒を超えると、そのプログラムが強制終了されます。
具体的には、Maximum execution time of 30 seconds exceededというメッセージとともに強制終了されます。
sleepやusleepで実行率を下げればいける!?と思いましたが、完了するまでの時間を伸ばすだけで、実処理のCPU時間の上限は変わりません。考えると当たり前ですね・・そのためほぼ同じ位置で処理が止まります。
CPUをぶん回し、30秒以内に完了するプログラムは、そのままなんの工夫もしないでいけます。
30秒をちょっとでも超えるプログラムは、強制的にプロセスが終了してしまうので対策が必要です。
エックスサーバーで30秒以上のCronを上手に運用する3つのコツ
これからご紹介するのは、エックスサーバーに限らず、PHPをcron実行させ、時間制限のあるサーバーでCronを使うためのコツとして使えます。
同じ処理を何度もcron実行させ、目的の処理を完了させるように変更します。
コツ1 ループ処理の実行時間を計測する
microtime()で経過時間を測定します。これは、強制終了で中途半端な位置で終了を防ぐ目的です。
以下のようなループ回数が多いパターンなどで使えます。
foreach( $datas as $key => $data ){
1つあたりの処理時間は大したことがない関数();
ループ回数が多いと強制終了される
}
このように実行から28秒経過した時点でループ処理を抜けることが可能になります。
$st = array_sum( explode(' ', microtime() ));
$実行時間タイムアウト=false;
foreach( $datas as $key => $data ){
if( (array_sum( explode(' ', microtime() )) - $st ) >= 28 ){
$実行時間タイムアウト=true;break;
}
1つあたりの処理時間は大したことがない関数();
ループ回数が多いと強制終了される
}
if( $実行時間タイムアウト ){
// タイムアウト用処理
}
完了処理();
これで許容されるCPUフルの時間前に処理を停止することが可能になります。
コツ2 処理結果を記録する
コツ1で実行時間を判断することが可能になりました。このままでは毎回先頭から始まってしまうので、何度やっても同じところで止まってしまいます。これを回避するにはやった処理を記録し、スキップさせます。
$st = array_sum( explode(' ', microtime() ));
$実行時間タイムアウト=false;
$進捗=array(); if( file_exists("進捗.json") ){ $進捗 =json_decode(file_get_contents("進捗.json"),true);}
foreach( $datas as $key => $data ){
if( array_key_exists( $key , $進捗 ) == true) { continue;}
if( (array_sum( explode(' ', microtime() )) - $st ) >= 28 ){
$実行時間タイムアウト=true;break;
}
1つあたりの処理時間は大したことがない関数();
$進捗[$key]=true;
ループ回数が多いと強制終了される
}
file_put_contents( "進捗.json", json_encode($進捗) );
if( $実行時間タイムアウト ){
// タイムアウト用処理
}
完了処理();
実行した処理を処理済み配列$進捗に格納していきます。ファイルに保存して、次回実行時に読み込まれるので、複数回呼ばれても同じ処理を実行することがなくなります。
スキップさせたい単位の処理済み配列は、この例では、キーワード単位にしています。粒度はご自身の処理に合わせて変更することが可能です。
コツ3 throwを使ってシンプルにする
コツ1、コツ2で大抵対応できます。throwを使うと処理をシンプルに書くことが可能です。
時間を計測して、タイムアウトを検出したら、次の処理に進まずに処理を終了させたいですよね。
この際、throwを使います。
function main(){
try{
前処理();
時間計測している処理1();
時間計測している処理2();
時間計測している処理3();
後処理();
}catch(Exception $e ){
}
}
function 時間計測している処理1(){
ループ処理でタイムアウトを検出、throw new Exception("タイムアウト処理1");
}
メイン処理の中から個別に呼び出した処理でそれぞれタイムアウトを検出するようにしています。
通常、処理1が終了すると続けて、2、3、と流れていきます。throw new Exception("")で例外を発生させると次の処理に進まずに、メイン処理のcatch部に流れてきます。
これにより、メイン処理の構造を変えずに、シンプルに処理を中断させることができます。
おまけ PHPのバージョン指定を忘れずに
エックスサーバーは複数のバージョンのPHPを利用することができる環境になっています。
そのため、通常何もバージョンを指定しないphpは、PHP 5.3.3 です。
PHPのバージョンの違いによって思わぬ副作用があったりするので、必ずバージョンを指定して利用しましょう
PHP7系は以下のパスにあります。
/usr/bin/php7.1 (PHP 7.1.2)
/usr/bin/php7.0 (PHP 7.0.16)
おまけ2 cronの設定はsshからできるよ
エックスサーバーのコンソール(ブラウザ)からスケジュールを指定できます。
これ以外に、sshログインした後、以下コマンドでスケジュールを編集することができます。
$ crontab -e
viの使い方や、cronの書き方がわからない場合は、ググると詳しいサイトが見つかります。
先頭に#をつけるとコメントアウトできます。もし何か異常があったら先頭に#をつけて停止しておきましょう。
以下コマンドでスケジュールの一覧を確認することができます。
$ crontab -l
まとめ
ここまで、エックスサーバーで30秒以上のCronを上手に運用する3つのコツをご紹介してきました。
この記事にたどり着いた方はコアな方に違いない!って思ってます。
AMP対応!無料ブログのまとめ【2017年版】
AMP(Accelerated Mobile Pages)対応していますか?
AMP対応できているとGoogle検索結果の上位にカルーセル表示されたり、検索結果の説明文に「稲妻マーク AMP」と表示されます。
(スマホ表示です)
2016年10月ごろからGoogleの検索結果に反映されています。AMP対応のサイトは軽くて素早く表示できると利用者にも浸透しつつあります。
ワードプレスのサイトでは、AMP対応プラグインを導入することで簡単にAMP対応サイトへ早変わりします。
ワードプレスのAMP対応プラグイン公式サイト:https://www.ampproject.org/ja/
AMP対応サイトは、通常記事のURLのほか、AMP用のURLを持ちます。そのため、HTMLデザインを編集してどうにかするようなものではありません。
無料ブログの対応も始まっています。
AMP対応!無料ブログのまとめ【2017年版】一覧
メジャーな無料ブログをまとめています。地方ブログ系は調査していません。
続きはこちら
エックスサーバーでSIRIUSサイト(iPhone)は500サーバエラーになりがちです
『sv1〜sv1999サーバー』ハードウェアの大幅増強および最新サーバー環境への移行(2017年11月告知)
新サーバー移行後、本記事の内容は不要です。うまく動作しなくなる可能性があります。
すでにSIRIUSの.htaccessに記載されている方は、suPHP_ConfigPath、AddHandler、FCGIWrapperの記載をコメントアウト、または削除してください。
エックスサーバーはとても快適に使えるサーバーとして評価されています。
SIRIUSの上位版を使ってHTMLサイトをアップロードして、iPhoneで確認するとエラーになります。
「>アクセスしようとしたページは表示できませんでした。」
500 Internal Server Error
パソコンからEdge/Chrome/Safari/FireFoxでアクセスすると正常に表示されます。
そのため見逃しがちになりやすいエックスサーバー特有の現象です。
エックスサーバーでSIRIUSサイト(iPhone)は500サーバエラーになりがちの理由
続きはこちらワードプレス4.8をSQLite3で動かす手順【MySQL必要なし】
手順だけ知りたい方は、こちらからどうぞ。
ワードプレスとは
ワードプレスは、オープンソースで公開されている無料のコンテンツマネージメントシステムです。
コンテンツマネージメントシステム(CMS)といっても、イントラ<=>インターネット間の同期や情報の公開承認機構など高度なシステムではありません。
インターネット上に公開したサイトに対する記事やページを管理することができるシステムです。
ワードプレスは、テーマを変えることでデザインの変更や機能拡張が可能です。
さらに、世界中の人が公開しているプラグインをインストールすることでさらなる機能拡張が可能です。
ブログからEコーマースサイトまでサポートすることが可能です。
ワードプレスは、ApacheもしくはNginx・IISのHTTPサーバー上で動作させることができます。
実行には、PHP5またはPHP7のモジュールと通常MySQL5.6以降(データベースサーバー)またはMariaDB10.0以降が必要になります。
MySQLの他に、PostgreSQLをご利用することも可能です。
PostgreSQLは、PostgreSQL for Wordpressプラグインを利用するのが簡単です。
SQLServerはPHP用ドライバーがあります。ただプラグイン等はないので、
上記のようなプラグインを参考にしながらプラグインを作る必要があります。
(ワードプレスコアは、速いサイクルで更新されています。そのためコアの変更はおすすめできません)
ワードプレス4.8をSQLite3で動かすデメリットとメリット
ワードプレスはMySQLデータベースサーバーを使って動かすことが前提となっています。
これをSQLite3を使って実現する方法は自前でやる以外の方法で、2つあります。
- PDO (SQLite) For WordPress
長らく更新されていません。 - SQLite Integration
ここ最近更新されていません
どちらもワードプレスのプラグインを使った方法です。
今回ご紹介する最新ワードプレス4.8でSQLite3で動かす手順は、SQLite Integrationを利用します。
ワードプレスをSQLite3で動かすデメリットはあるの?
あります!
まずSQLite3のデメリットがあります。
SQLite3は参照系(select)やInsert(新規追加)が高速!という特徴があります。
一方、更新系(Update)や削除(Delete)は遅いので、大きなサイトには向かないです。
これ以外にワードプレスをSQLite3で動かすデメリットは、以下の通りです。
- 1)表面上は動くのに、深いところで動作しない可能性がある
ワードプレスは、テーマやプラグインで拡張できるとご紹介しました。
ワードプレスには、テーマやプラグインからアクセスできるよう共通関数やヘルパクラスなどが用意されています。
テーマやプラグインのソースコードは、名前空間の衝突さえなければ、ほぼ自由に創ることができます。
そのため、保守性が高いソースコードもあれば、保守性をあまり考えていないソースコードもあります。
データベースを利用する箇所がMySQLソースの直書きのような場合、その機能を使うタイミングでないと動く動かないの見定めがわかりにくいです。 - 2)サイト解析プラグインや訪問者アクセスチェックなどのプラグインは避けた方が無難
SQLite3は注意深く設計してもdatabase lockが発生しやすいと感じています。
記事の投稿・更新などは複数人同時更新は避けた方が無難です。
これと同じ理由で、訪問者が訪れた場合にデータベースへアクセスしてきたページや訪問者の画面サイズなどを記録するサイト解析系プラグイン、アクセスチェックなどのツールは避けた方が無難です。
また、テーマによっては、アクセス数をカウントする機能が盛り込まれたものがあります。同様の理由で避けた方が無難です。
動かすことは可能です。複数同時実行の際、予期しないエラーが発生しやすいです。 - 3)不具合が起きた場合、情報が少ないため自力解決が基本
全て自己責任です。
ワードプレスの高速化目的の場合、SQLite3で動かすメリットはありません。高速化の場合、高機能キャッシュプラグインはほぼほぼ使えないのでデメリットしかありません。
ワードプレスをSQLite3で動かすメリットって何?
デメリットしかなさそうなSQLite3を利用したワードプレスですが、メリットってあるんでしょうか?
あります!
これから2つのメリットをご紹介します。
- 1)データベースの移動が簡単
SQLite3はファイル型データベースです。SQLite Integrationプラグインは1つのSQLite3データベースファイルを利用します。
ローカルで確認してリモートへアップしたい、リモートにアップした内容をローカルで確認したい、こういった場合、SQLite3が大きな武器になります。
1つのファイルを移動するだけ、ローカル<=>リモートのデータベース同期が可能になります。
MySQLの場合、ダンプ=>インポートで同じようなことができます。 - 2)激安レンタルサーバーにワードプレスが設置できる
激安レンタルサーバーの中には、ワードプレスが動く!っていうサーバーもあります。
ただ、多くは、PHPは動作する、MySQLは提供なしというパターンが多いです。
MySQLなしでワードプレスを動かす選択肢として、SQLite3のメリットがあります。
わざわざ激安サーバーでワードプレスを動かすメリットがあるの?賢威のHTMテンプレートやSIRIUSでいいんじゃない?
メリットはあります。
ワードプレスは、Accelerated Mobile Pages (アクセラレーテッド・モバイル・ページ、 AMP) をプラグインを導入するだけで構築することができます。
AMPプラグインは無料です。
知らない方のための賢威、SIRIUSのご紹介
賢威はHTMテンプレートとワードプレステンプレートがいつでもダウンロードして使うことができます。
SEOに強いってよく言われています。
SIRIUSは、次世代型サイト作成システム、Windowsでテキスト記事を書くだけで立派なHTMLサイトが作れてしまうツールです。
どちらも甲乙つけがたい優れたツールです。
持っている方は活用した方が良いでしょうし、
持っていない方はそれほど高額ではないので購入した方が良いと思います。
賢威は、7系テンプレートと6系テンプレートがご利用可能です。
7系のテンプレートは、6種類【クール版、ビューティ版、プリティ版、コーポレート版、スタンダード版、ストーリー版(近日リリース予定)】でそれぞれHTML版、ワードプレス版があります。
6系のテンプレートは、5種類【コーポレート版、クール版、プリティ版、ヘルシー版、マネー版】でそれぞれHTML版、ワードプレス版があります。
7系のテンプレート、6系のテンプレートはそれぞれ共通化されています。
6種類、5種類とデザインを切り替えることができるのですが、
HTMLの構造は、共通化されている関係で、7系で1つ、6系で1つといったイメージになります。
SIRIUSは、デフォルト、ビジネス、レスポンシブ、角丸タイプの4つからオレンジ(1/2/3カラム)、グリーン・・・などの色とカラムタイプが選べます。
HTMLの構造はどれもほとんど同一に近いです。
一方ワードプレスは、292,000を超えるテーマがあります。
テーマを変えることで様々なHTML構造に簡単に変更できるというメリットがあります。
ワードプレス4.8をSQLite3で動かす手順
本記事は、すでにMySQLで動作させているワードプレスサイトは対象にしていません。
MySQLがない環境で新たにワードプレスサイトを立ち上げる手順です。
sshログインできるサーバー、FTPのみのサーバーと環境に依存する部分があります。
サーバーに依存しない基本的な手順と、sshできる環境での手順、FTPのみの環境での手順をご説明します。
【ワードプレスを正常に実行させる必須の要件】
- Apacheのmod_rewriteモジュールが動作する環境(Apache or Nginx )
- htaccessファイルが設置可能である
これら必須要件と、合わせてPHP7以降(ワードプレス4.8の推奨要件より)が動作する環境が望ましいです。
【SQLite Integrationを正常に実行させる必須の要件】
- PDO extensionが有効(PHP5.3以上)
- PDO SQLiteが使える
レンタルサーバーの確認方法
レンタルサーバー各社の公式サイトでPHPのバージョンやMySQLのバージョンが確認できます。
ただPDO extensionが有効なのか、PDO SQLiteが使えるのか、ちょっと深い情報になると開示状況はまちまちです。
こちらで格安レンタルサーバーの比較を紹介しています。
どこでも1、2週間の間はお試し利用が可能です。深い情報は実際に使ってみて確認するのが一番早いです。
無料期間中に以下PHPファイルを配置して確認しましょう。
ファイル名:test.php(ご自由です)
<?php
phpinfo();
初期ドメインでアクセスできるフォルダ直下にtest.phpを配置してください。
ブラウザで「初期ドメイン/test.php」にアクセスすることで状態が確認できます。
【phpinfoで確認する項目】
- PDO drivers で検索します。
enabledにsqliteがあることを確認します。
- SQLiteのバージョンの確認は必須ではありません。
SQLite Library で検索します。enabledにある値がご利用できるSQLiteのバージョンです
基本の手順
手順1 ワードプレスの最新版のダウンロード
ワードプレスの日本語版の最新ダウンロード先から最新版をダウンロードします。
現在の最新版はワードプレス4.8です。
ZIPファイル:https://ja.wordpress.org/latest-ja.zip
tgzファイル:https://ja.wordpress.org/latest-ja.tar.gz
手順2 ダウンロードしたワードプレスの展開
取得したワードプレスは圧縮されています。
拡張子に則した方法でワードプレスを解凍します。
手順3 SQLite Integrationプラグインのダウンロード
入手先:SQLite Integration
直リンク:https://downloads.wordpress.org/plugin/sqlite-integration.1.8.1.zip
手順4 SQLite Integrationプラグインの展開と設定
Windowsはエクスプローラー標準機能で解凍できます。Linux系の場合は、unzipコマンドで解凍できます。
展開先:wordpress/wp-content/plugins/
展開後、以下フォルダがあることを確認します。
展開後:wordpress/wp-content/plugins/sqlite-integration/
【必須の設定】
wordpress/wp-content/plugins/sqlite-integration/db.phpファイルをコピーします
コピー先:wordpress/wp-content/db.php
必須の設定は、ここれだけです。オプションとしてSQLiteのファイル名を変更する、フォルダを変更する方法があります。次の「手順5 ワードプレスの設定」で説明しています。
手順5 ワードプレスの設定
最新版ワードプレスを展開するとwordpress/wp-config-sample.phpが解凍されています。
wordpress/wp-config-sample.phpをリネームします。
リネーム名:wordpress/wp-config.php
これで準備完了です。
MySQLを使わないため、wp-config.phpを編集する必要はありません。
SQL Integration用の設定がいくつか可能です。
wp-config.phpを編集する際は、必ずUTF-8(BOMなし)で保存してください。
【SQLiteのファイル名を変更する】
DB_FILEでSQL IntegrationがアクセスするSQLite3データベースのファイル名を変更することができます。
wp-config.phpに追加します。
define('DB_FILE', 'your_database_name');
your_database_nameのままでも大丈夫です。
your_database_nameをお好きな名前に変更してください。
変更したwp-config.phpはサーバーにコピーしてください。
【SQLiteのフォルダを変更する】
DB_DIRでSQL IntegrationがアクセスするSQLite3データベースのフォルダを変更することができます。
HTTPでアクセスできないフォルダを指定することでセキュリティが向上できます。
define('DB_DIR', '/home/youraccount/database_directory/');
手順6 ワードプレスの設置と初回アクセスでサイト名、ユーザー名、パスワードの設定
サイトを公開したいサーバーへ設置します。
ドメインやフォルダの指定をコントロールパネルで指定後、
公開したURLにアクセスし、サイト名、管理者ユーザー名、管理者パスワードを指定します。
お疲れ様です。これで手順完了です。
もし、アクセスしても真っ白な画面になってしまった場合、
ドメイン/wp-login.phpへアクセスしてみてください。
これでも真っ白画面の場合、wp-config.phpがBOM付きUTF-8で保存されている可能性があります。
文字コードを指定できるエディタ(sakura editor、秀丸エディタ等)でUTF-8(BOMなし)保存したものを
再アップロードし確認してみてください。
ワードプレス4.8をSQLite3で動かす手順【SSHでログイン編】
本手順は、Linux系コマンドを多用しています。
設定は、「基本の手順」に従っています。よくわからない場合は、参照してください。
ご契約しているレンタルサーバーのコントロールパネルでワードプレスを動かしたいドメインの初期設定を行います。
初期設定で、~/ドメイン名/public_html/などのフォルダが自動生成されるかと思います。
後からフォルダを指定することで公開できるタイプのレンタルサーバーの場合は、省略して構いません。
これからご紹介するのは、
~/ドメイン名/public_html/にSQL Integrationを適用した最新ワードプレスを設定する流れになります。
1 sshでログインする
$ ssh レンタルサーバー
$ cd ~/ドメイン名/
2 必要なファイルをダウンロード
カレントフォルダは、~/ドメイン名/です。
$ curl -O https://ja.wordpress.org/latest-ja.tar.gz
$ curl -O https://downloads.wordpress.org/plugin/sqlite-integration.1.8.1.zip
3 展開(解凍)
カレントフォルダは、~/ドメイン名/です。
$ cd public_html
$ tar xvzf ../latest-ja.tar.gz --strip=1
$ mv wp-config-sample.php wp-config.php
$ cd wp-content/plugins/
$ unzip ../../../sqlite-integration.1.8.1.zip
$ cp -p db.php ../../.
公開フォルダがpublic_htmlではなく~/ドメイン名/方式の場合は、cd public_htmlは不要です。
4 必要な方はwp-config.phpを修正します
「手順5 ワードプレスの設定」を参考に、SQLite Integrationのオプションを指定してください。
5 用済みのファイルを削除する
後始末です。
latest-ja.tar.gzファイル、sqlite-integration.1.8.1.zipファイルは使わないので、削除します。
必要な方は残しておいて構いません。
$ cd ~/ドメイン名/
$ rm latest-ja.tar.gz
$ rm sqlite-integration.*.zip
これでMySQLなしでSQLite3+最新ワードプレスの環境が整いました。
あとは、「手順6 ワードプレスの設置と初回アクセスでサイト名、ユーザー名、パスワードの設定」でワードプレスの初期設定を始めましょう!
ワードプレス4.8をSQLite3で動かす手順【FTPで転送編】
ご契約しているレンタルサーバーのコントロールパネルでワードプレスを動かしたいドメインの初期設定を行います。
初期設定で、~/ドメイン名/public_html/などのフォルダが自動生成されるかと思います。
後からフォルダを指定することで公開できるタイプのレンタルサーバーの場合は、省略して構いません。
これからご紹介するのは、
~/ドメイン名/public_html/にSQL Integrationを適用した最新ワードプレスを設定する流れになります。
Windows10 PCを使っていることを想定した流れです。
FTPソフトは、FFFTP Ver 1.99a-20170325などご利用ください。
1 必要なファイルをダウンロード
Chromeで以下URLのファイルをダウンロードします。
https://ja.wordpress.org/latest-ja.zip
https://downloads.wordpress.org/plugin/sqlite-integration.1.8.1.zip
Microsoft Edgeは、ダウンロードできない場合があります。
wordpress.orgはwordpressの公式ドメインです。
3 展開(解凍)とコピー(その1)
Windows10のダウンロードフォルダにlatest.zip、sqlite-integration.1.8.1.zipを解凍します。
図のようにpluginsフォルダにsqlite-integrationを移動またはコピーします。
4 db.phpのコピー
図のようにplugins\sqlite-integration\db.phpをwordpress\wp-contentへコピーします。
5 必要な方はwp-config.phpを修正します
「手順5 ワードプレスの設定」を参考に、SQLite Integrationのオプションを指定してください。
6 再圧縮
ご契約のレンタルサーバーのコントールパネルから、圧縮ファイルを解凍する機能はあるでしょうか?
解凍する機能がある場合、ワードプレス+SQLite3を整えた圧縮ファイルを作成した方がスムーズに進められます。
圧縮ファイルは1ファイルの転送で完了します。
もし、解凍する機能がない場合、生ファイルをFTP転送するため、
数多くのファイル転送を行うことになります。途中で失敗することもあるので、リトライしながらアップロードします。
FTPで転送できるように再圧縮します。
図のようにwordpressフォルダを全選択後、圧縮ファイルを作ります。
圧縮ファイル作成後、任意のファイル名に変更することができます。
7 FTPで公開サーバーへ転送する
FFFTPで公開サーバーに接続し、
ドメイン名/public_htmlへ移動します。
解凍機能があるレンタルサーバーの場合、index.zipをアップロードし、コントロールパネルから解凍してください。
解凍機能がないレンタルサーバーの場合、全ファイル選択後、アップロードしてください。
ファイル数が多いので、転送完了までにはしばらく時間がかかります。
これでMySQLなしでSQLite3+最新ワードプレスの環境が整いました。
あとは、「手順6 ワードプレスの設置と初回アクセスでサイト名、ユーザー名、パスワードの設定」でワードプレスの初期設定を始めましょう!