CMS構築を目的にPHPをベースとしたWordPress、CakePHPやPEARなどオープンソースを中心に解説しています

今回、改めてPHPのライブラリを使ってTwitter botを作る方法を調べます。
Twitter botと聞くとだいぶ懐かしいような感じもしますが、最新の技術動向もふまえて実装してみます。
PHPライブラリは最近、利用例をよく見かける「TwitterOAuth」を使ってみます。
TwitterOAuth

今回検証した環境は以下のとおりです

PHP 7.0.18
TwitterOAuth 0.7.4

WordPressでは通常の記事投稿や固定ページなどデフォルトの投稿タイプとは別に、自身で新しい投稿タイプを追加することができます。
最近ではWordPressをブログとしてだけではなく、本格的なCMSとして活用する場面も多くなってきました。そんな中で、店舗一覧、スケジュール一覧、商品一覧などオリジナルのカスタム投稿タイプを追加したい場合に、この方法は重宝します。

今回は例として、カスタム投稿タイプ「店舗一覧」を追加する想定で、コードを書いてみます。

カスタム投稿タイプ「店舗一覧」を追加

WordPressでカスタム投稿タイプを設定するためには、function.phpなどにアクションフックを設置して、そこで関数「register_post_type」を記述することで実現できます。
カスタム投稿タイプ「店舗一覧」を追加するコードは以下のようになります。

function create_post_type(){
	$args = array(
		'label' => '店舗一覧',
		'labels' => array(
			'singular_name' => '店舗一覧',
			'add_new_item' => '新規店舗を追加',
			'add_new' => '新規追加',
			'new_item' => '新規店舗',
			'view_item' => '店舗を表示',
			'not_found' => '店舗は見つかりませんでした',
			'not_found_in_trash' => 'ゴミ箱に店舗はありません。',
			'search_items' => '店舗を検索'
		),
		'public' => true,
		'has_archive' => true,
		'menu_position' => 5,
		'supports' => array('title','editor','thumbnail','custom-fields')
	);
	register_post_type('shop', $args);
}
add_action('init', 'create_post_type');

PHPベースでCMSを構築する際に、アップロードされた画像をGDライブラリを利用してリサイズ、トリミング、圧縮などの画像処理をすることがよくあるのですが、改めてその性能について検証してみようと思います。
また、今回は画質がよいと言われているImageMagickライブラリもあわせてテストしてみます。

検証した環境は以下のとおりです。FuelPHPをベースとしたCMSで、GDライブラリとImageMagickライブラリの圧縮率をそれぞれ変えてみて、jpgファイルの品質を比較してみます。

PHP 7.0.18
FuelPHP 1.8

テストに利用するのは以下の横幅720px、縦幅480pxの画像です。

オリジナル画像 720x480 (173KB)

オリジナル画像 720×480 (173KB)

この画像をそれぞれのライブラリで品質を100%、90%、80%、70%に設定して、サイズ640 x 480にトリミングしてみます。

処理結果は以下の通りです。

PHP用のFacebook SDKを利用して「Facebookでログインする」機能の実装にチャレンジします。

実証環境はPHP 7.0.15です。

Facebookでアプリ登録

まず初めに、Facebookでのログインを実現するには、Facebookでアプリ登録をする必要があります。
開発者向けFacebook

ヘッダ右上の「アプリを作成」ボタンを押して、アプリ名など必要事項を入力します。
アプリ作成後、アプリIDとapp secretを取得し、控えておきます。また、アプリに接続可能なドメイン「アプリドメイン」を登録します。
※Facebookアプリ登録には、Facebookでの電話認証済み、または、クレジットカード認証済みであることが前提です。

また、必要に応じて、アプリのカテゴリ、規約URL、プライバシーポリシーURLやアプリアイコン画像などを設定しておくとよいでしょう。

composerでPHP用のFacebook SDKをインストール

PHP用のFacebook SDKのインストールはcomposerで実行します。

まず、composer.jsonを開いて、以下の内容を追記します。

"require": {
	...
	"facebook/graph-sdk" : "~5.0",
	...
},

FuelPHPのOpauthパッケージを利用してFacebookのログインにチャレンジしてみます

実証環境はPHP 7.0.15、FuelPHP 1.8です。

Facebookでアプリ登録

まず初めに、Facebookでのログインを実現するには、Facebookでアプリ登録をする必要があります。
開発者向けFacebook

ヘッダ右上の「アプリを作成」ボタンを押して、アプリ名など必要事項を入力します。
アプリ作成後、アプリIDとapp secretを取得し、控えておきます。また、アプリに接続可能なドメイン「アプリドメイン」を登録します。
※Facebookアプリ登録には、Facebookでの電話認証済み、または、クレジットカード認証済みであることが前提です。

また、必要に応じて、アプリのカテゴリ、規約URL、プライバシーポリシーURLやアプリアイコン画像などを設定しておくとよいでしょう。

Opauthパッケージのインストールと設定

Opauthパッケージのインストールはcomposerで実行します。

まず、FuelPHPがインストールされているルートディレクトリに移動して、composer.jsonを開いて、以下の内容を記述します。

"require": {
	"php": ">=5.3.3",
	"monolog/monolog": "1.5.*",
	"opauth/opauth": "0.4.*",
	"opauth/facebook": "dev-master",
	"fuelphp/upload": "2.0"
},

WordPressの関数「wp_head」はデフォルトでさまざまなコードを出力します。
オリジナルでテンプレートを開発する場合に、このコードが邪魔になることがほとんどです。しかし、wp_head自信を削除してしまうと、プラグインなどが正常に動作しなくなる危険性があります。
なぜなら、wp_headやwp_footerがあることを前提に開発されているプラグインが多くあり、動作に必要なコードを出力しているからです。

そこで、今回はfunctions.phpにアクションフックを記述して、不要なコードの出力を省く方法を調査します。

実際に表示されるコードと削除方法

以下、各セクションにおいて、まずwp_headを読み込むとデフォルトで出力されるHTMLソースを提示します。
次に、そのソースを表示させないため、functions.phpに書き込むアクションフックを示します。

※順不同です。また、新しいバージョンでは表示されなくなっているものもあります。

レンタルサーバの「エックスサーバー(XSERVER)」でSSH接続し、FuelPHPのoilコマンドを実行する方法です。

ある日、エックスサーバー上でFuelPHPをベースとしたWebアプリを構築しようと思い、oilコマンドでmigrateを実行しようとしたらうまくいかずエラーになってしまいました。
その際に調べた解決方法をメモとして残しておきます。

エックスサーバーでoilコマンドを実行してエラー

まずは、Windowsからputtyを使ってエックスサーバーに接続し、phpコマンドを実行してみました。phpコマンドのパスは、オフィシャルのリファレンスより「/usr/bin/php5.6」とのこと。
プログラム言語・コマンドパス | レンタルサーバー【エックスサーバー】

$ /usr/bin/php5.6 -v
PHP 5.6.22 (cgi-fcgi) (built: Jun 22 2016 03:15:28)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies

問題なく動作しているようです。

PHPの画像認証ライブラリにはいくつかありますが、今回はその中でも割とメジャーな「Securimage」の使い方を調べてみます。
Securimage PHP Captcha | Free Captcha Script

画像認証は、Web画面からログインしたり、新規情報登録をする場合に、パスワードなど文字による認証だけでなく、画像により認証するしくみです。
認証画面では悪意あるプログラムなどから、総当り的に認証を試みる攻撃を受けることがあります。具体的には、認証が通るまで機械的にパスワードを打ち続けるなどです。
これらの攻撃からサイトを守るために、動的に生成された画像からコードを読み取ったり、画像をドラック&ドロップで移動させたりといったしくみで、ワンランク上のセキュリティ対策を実現します。

「Securimage」は文字列を画像として自動生成するタイプの画像認証ライブラリで、その文字列を見て入力しないと認証をパスしないしくみを実現します。

導入方法

上の公式サイト、または、GitHubのサイトより、ソースをダウンロードします。現時点での最新のバージョンは3.6.4です。
GitHub – dapphp/securimage: PHP CAPTCHA Script

ソースを解答し、フォルダごとサーバにアップロードします。
ここでは「/secureimage/」にアップロードしたと仮定します。

次に、画像認証を利用したい画面に、以下のようにして画像を表示させます。

最近、まれに以下のようなPHPエラーに出くわします

Fatal error: Can't use method return value in write context in ... on line xxx

実際に該当する箇所のソースを確認してみると、どうやら関数「empty()」に原因があるようです。

if (!empty($command->getMessage())){
...

調べてみると、PHP 5.4以下では関数「empty()」や「isset()」は、引数には関数の戻り値ではなく変数を設定しなければいけないようです。

対策1:関数の戻り値に変数を割り当てる

PHP 5.4以下では、以下のように変数を割り当てることで、エラーを回避できます。

$message = $command->getMessage();
if (!empty($message)){
...

対策2:PHPのバージョンを5.5以上にする

この現象はPHP 5.4以下で発生するので、サーバ環境を5.5以上、5.6や7.xにアップグレードすることでエラーを回避できます。

最近このエラーを見かけるようになった理由として、
一部サーバ環境で5.6や7.xへのアップグレードが進む中、パッケージも環境が5.6以上などを奨励するように設計されています。
そんな中、やや古めの自社サーバやレンタルサーバの環境では5.4以下が残っているため、パッケージをインストールした際にPHPエラーが発生するようです。

PHPの関数「mail()」で添付ファイル付きのメールを送信する方法です。

今回、日本語対応を前提に、ラッパー関数である「mb_send_mail」を使います。

添付なしメールを送る場合

通常、添付なしでメッセージのみのメールを送る場合は、以下のように記述します。

$to = "【送信先メールアドレス】";
$subject = "【メールタイトル】";
$message = "【メール本文】";
$additional_headers = "【オプションでメールヘッダに文字列追加】";
mb_send_mail($to, $subject, $message, $additional_headers);

$additional_headersには、送信元メールアドレスなどをセットします。

$header = "From:【送信元メールアドレス】\n";

これにプログラム上で任意のファイルを添付するためには、$message部分と$additional_headers部分に以下のようなフォーマットで追記します。

Monthly Archives

Search