「PHP」カテゴリーアーカイブ

Windows365 で MySQL / PHP

2021年8月2日から「Windows365」サービスが始まった。「え? そんなのずいぶん昔からあるじゃん、Word, Excel, PowerPointとかセットで月額料金で使うやつでしょ?」と思ったあなた。オシイ!それは「Microsoft365 (旧商品名 Office365)」。これは「Windows365」。マイクロソフト社は商品名に365って付けるのがマイブームなのか知らんけど、名前が似ててややこしい。

Windows365 は、マイクロソフト社がネット上に Windows パソコンを用意してくれて、こちらはそれをブラウザとかで遠隔操作して使う「クラウドPC」とも呼ばれるサービス。

データ処理とか実際にいろいろ仕事するのはネット上のパソコンで、こちらはその仕事の様子をブラウザ越しに眺めてればいいので、こちらが手元に用意する端末は安っちいWindowsパソコンでもMacでもiPadでもiPhoneでもAndroidでもとにかくブラウザとそこそこ速度があるインターネット環境があればOK。

うちの会社はMacで仕事してるんだけど、経理ソフトや給与計算ソフトなど Windows でしか動かないソフトがちょくちょくあるので、いままでは「VMWare Fusion」という仮想環境構築ソフトをインストールしてMacOS内にWindowsOS環境を立ち上げて使ってた。ところが、MacのCPUがインテル製からアップル製に変わったことで(WindowsOSはインテル製CPUを搭載したパソコンで動作する前提になってるので)VMWareFusionによるWindows仮想環境が作れなくなった(ARM版WindowsOSを使う方法もあるけど、ARM版Windows自体が不安定だったりライセンス上の問題があったりビミョー)。

たまにしか使わないWindows環境用に安っちいWindowsパソコン買うって方法もあるんだけど、外出を考えるとパソコン2台持ち歩くのは苦痛でしかない。そんなときにうまい具合に登場したのが Windows365 ってわけ。

サービス開始と同時に申し込んで使ってみた。マイクロソフトの公式サービスなので当然だけど、サービスに接続した時点ですでにWindows10が出来上がっているってのは楽。OSのインストールからやるのは年寄りにはしんどい。2021年8月時点でWindows365のWindows10は米語版になっているから最初にあれこれ日本語用に設定を変えないと使いにくい。契約時に言語設定を決めてその言語版のWindows10を用意してくれるとさらに楽ちんなんだけど、まあしょうがない。

前振りはこの程度にして、せっかくのWindowsなのでWebアプリのちょっとした動作確認用に IIS / MySQL / PHP も立ち上げた。Windows365ではこちらの権限が管理者じゃないのでちょっと苦労した。このままだと2度とできないかもしれないので、自分用のメモ代わりに書いとく。

あ、Windows365はブラウザで利用できるんだけど、マイクロソフト社製の「Microsoft Remote Desktop」っていう遠隔操作用ソフトを使った方が、それ用に作られているから使いやすい。

IISの起動

これはネット上で「Windows 10 IIS 設定」検索すれば山ほど出てくる。そのとおりにやればOK。コントロールパネル > プログラム > Windowsの機能の有効化または無効化 の画面で「インターネットインフォメーションサービス」をONにする。その際にインターネットインフォメーションサービスを深掘りして World Wide Web サービス > アプリケーション開発機能 > CGI にもチェックマークをつけておく。

MySQLのインストール

MySQL は Windows 用のインストーラを使うと楽ちんなんだけど、Windows365だとインストールの途中でアクセス権が足りないとかなんとかそんな感じのエラーで止まってしまう。msiを管理者権限で起動させるとかいろいろ考えたけどうまくいく方法が見つからなかった。

そこで、zipファイルをダウンロードして手動でセットアップすることにした。MySQL 5.7.35 の64-bit の zipファイルをダウンロード。C:/Program Files/ に[MySQL] フォルダを作成してその中へ展開。フォルダ名が長いからインストーラでインストールした時の構成に合わせて[MySQL Server 5.7] に変える。my.iniを作るんだけどこれが面倒くさかったのでとりあえず必要最小限のことだけ書いたmy.iniを作ってC:/Program Files/MySQL/MySQL Server 5.7/my.ini として保存。

コマンドプロンプトから操作しやすいようにシステム設定でMySQLのbinフォルダにパスを通しておく。[設定]>[詳細情報]>[システムの詳細設定]>[詳細設定]タブ>[環境変数]>[システム環境変数]>[Path]>[編集] で [C:/Program Files/MySQL/MySQL Server 5.7/bin] を追加する。

コマンドプロンプトを[管理者権限で起動]する。下記のコマンドを実行して MySQL の初期化を実行()

mysqld –defaults-file=”C:\Program Files\MySQL\MySQL Server 5.7\my.ini” –initialize-insecure –user=mysql –console

マイクロソフトの公式サイトから Visual Studio 2013 の visual C++ 再頒布可能パッケージの64bit版をダウンロードしてインストール

C:/ProgramData
└MySQL
  └MySQL Server 5.7
    ├Data
    └Uploads

コマンドプロンプトを管理者権限で起動。

mysqld –initialize-insecure –user=mysql

初期化完了

mysqld –console

mySQLが起動できればVersion: ‘5.7.35’ soket: ” port: 3306 MySQL Community Server (GPL)という表示が出る

コマンドプロンプトをもう一つ起動して

mysqladmin -u root password “hogehoge”

でrootにパスワードを設定

mysql -u root -p

でMySQLに入れることを確認。

exit;

で終了。

mysqladmin -u root -p shutdown

でMySQLを終了。

mysqld –install MySQL57

でサービス化

Windows管理ツール>サービスでMySQLがサービスとして登録されている(スタートアップの種類は自動)

再起動

PHPのインストール

php公式サイトからWindows用7.4.22の64bit用NonThreadSafeのzipをダウンロード

C:/Program FilesにPHPフォルダを作ってその中にzipを展開。

PHPフォルダへパスを通しておく

php.iniの作成

Visual Studio 2015-2019 用 Microsoft Visual C++ 再頒布可能パッケージをダウンロードしてインストール。

コマンドラインからphp -vを実行してphpのバージョンが表示されればとりあえずOK

iisの有効化

Windowsシステムツール>コントロールパネル>プログラム>Windowsの機能の有効化または無効化

インターネットインフォメーションサービスにチェックマークをつけると必要なものが有効化される。+ボタンをクリックして中を開いて

World Wide Web サービス
├HTTP共通機能
  └ディレクトリの参照をオフ
└アプリケーション開発機能
  └CGIをオン

他は初期設定のままで[OK]。

Edgeを起動してhttp://localhostでIISの初期画面が出ればOK

Windows 管理ツール>インターネットインフォメーションサービス(IIS)マネージャーを起動

PHPでセッションファイルの保存場所

 Windows Web Server 2008にPHP5.3.3をインストールして使ってたんだけど、C:\Windows\Tempにあるエラーログ(php-errors.log)にときどきPHP Notice: session_start(): ps_files_cleanup_dir: opendir(C:\Windows\Temp) failed: No error (0)というエラーが記録されている。「session_start()の実行時にセッションファイルが格納されるディレクトリへのアクセス権がなくてps_files_cleanup_dirに失敗した」ってことかな? でもセッションを使った認証機能などは正常に動いているようだし、session_start()をコールしてもたまにしかこのエラーが発生しない。特定のスクリプトで起きているわけでもなさそうだし。なにかの確率に基づいてランダムに発生しているように見える・・・・・ある確率で発生するセッションに関することで思い出したのが古いセッションファイルの自動掃除、ガベージコレクションに失敗してるんじゃなかろうかってこと。Tempフォルダにガベージコレクションの実行権限を与えるか、ガベージコレクションの実行権限があるフォルダをセッションファイルの保管場所に変更するか(php.ini内のsession.save_pathを変更)。これで解決できればいいんだけど・・・どうだろう。

PHPでPDFファイルのプロパティを取得する(1)

TCPDFというPDF生成ライブラリが便利。比較的簡単にPDFファイルが作れる。ところでサーバに生成したPDFファイルを貯め込んである場合、その一覧表をつくる方法を考えた。最初に思いついたのが、TCPDFでPDFを生成するたびにMySQLに情報をいれて、これを使って一覧表のページをつくること。でも何かのはずみでディレクトリ内のファイルを削除したりリネームしたりしてしまうことがあるかもしれない。そうなると実態とMySQL内の情報がめちゃくちゃになってしまう。一番簡単なのはファイル名を使って一覧表を作ってしまうことだというのはわかる。でもファイル名だと中身がわかりにくい。さてどうしようか。

PDFファイルには「タイトル」「サブタイトル」「著者」「作成日」「更新日」「キーワード」といった情報を記録しておくことができる。

PDFファイルにはタイトルや著者などの情報を記録できる
PDFファイルにはタイトルや著者などの情報を記録できる

TCPDFにもPDFを生成するときにもこれらの情報を付加する関数がある。ということはここにいろいろ書いておいて、phpでこれを読み込んで一覧表をつくることができればディレクトリに実在するPDFファイルを対象にしつつわかりやすい一覧表が簡単につくれる、ハズ。

ハズ、なんだけど、どうすりゃいいんだ? ネットでいろいろ検索するとPDF生成ライブラリとして有名なPDFlibのオプション機能としてPDFプロパティの取得ができる機能があることがわかった。オプション単体でも存在しているんだけど、どっちにしても有料。うーんお金とれる話なら使ってもいいけど、趣味だからなあ。高すぎる。

で、phpユーザーのメーリングリストで質問したら、ZendFrameworkのZEND_Pdfという機能でOKとの回答。そうなのか。フ、フレームワークか。フレームワークって、知識としては知ってるけど未経験。CakePHPあたりの勉強してみようかなぁなんて思ってたくらいだからなあ。できるってことはわかったけど、使えるようになるまでにえらい時間かかりそう。でもいずれフレームワークも使えるようになったときのために覚えておこう。

メーリングリストでもうひとつ興味深い回答が。PDFファイルに記録されている情報なんだから直接取り出しちゃえば?という至極単純な回答。そりゃそうだ。あははは。

とりあえずバイナリエディタ「0xED」を使ってサイズの小さなPDFファイルを開いてみる。だらだらだら〜っと眺めていると、あった、あった。「/Title」っていう部分、ほかにも /Author、/Subject、/Keyword、/Creatorなどなど。それぞれ直後にある( )内がプロパティ値になっているらしい。( )内をいろんなエンコーディングで試してみたらUTF-16でバッチリ変換できる。

PDF形式のファイルをバイナリエディタでひらくと
PDF形式のファイルをバイナリエディタでひらくと

ここまでわかったらあと一歩。phpでPDFファイルをバイナリで開いて、「/Title (」ってのを探して、終わりの「)」を見つける。その間にあるバイナリデータはUTF-16なんだからこれをUTF-8に変換すればブラウザで表示できる。