タグ「PHP」が付けられているもの

以下のサイトで、便利そうなスクリプトが紹介されていました。


おおおお!という感じで飛びついたのですが、なかなか動いてくれなかったので、正しいかわからないけどメモ。

まずはダウンロード


以下のサイトから、スクリプトをダウンロードする。

[root@centos ~] wget http://forge.bearstech.com/trac/raw-attachment/wiki/PhpTop/phptop-0.5.2.tar.gz
--2010-12-20 10:43:30-- http://forge.bearstech.com/trac/raw-attachment/wiki/PhpTop/phptop-0.5.2.tar.gz
forge.bearstech.com をDNSに問いあわせています... 78.40.125.45
forge.bearstech.com|78.40.125.45|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 22333 (22K) [application/x-tar]
`phptop-0.5.2.tar.gz' に保存中
2010-12-20 10:43:32 (434 KB/s) - `phptop-0.5.2.tar.gz' へ保存完了 [22333/22333]

[WP] 正しく404エラーステイタスを返す方法

WordPressの場合、訪問者が存在しないURLにアクセスした場合、404エラーページを表示します。

テンプレートにも通常、404.phpというファイルにエラー表示の画面を記述します。

ユーザーからは確かにこの404ページが表示されるのですが、よくよくhttpヘッダーステイタスを見ると、404ではなく、200が帰ってくるときがあります。

これは間違ったURLによって違ってくると思うのですが、画面表示は404.phpの内容が表示されているにもかかわらず、Webサーバとしては、200という「正常なページでしたよ」というレスポンスをしてしまうのです。

ちなみにステイタスコードとは、以下のURLを参照ください。


なぜこれがダメなのかというと、Googleなどの検索エンジンのクローラーがエラーページにもかかわらず200ステイタスで受け取ると、エラーページそのものを正常なコンテンツとしてインデックスしてしまうことです。

iPadの検出とUser-Agent

  • 投稿日:
  • by
  • カテゴリ:

PHPのちょっとしたTipsです。

わたくし、iPhoneもiPadも持っていませんが・・・・

iPadのUser-Agentは以下のようなものらしいです。

Mozilla/5.0(iPad; U; CPU iPhone OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B314 Safari/531.21.10

ということで、PHPでiPadを検出するには、以下の通り。

先日、WordPressが意味不明のエラーで表示できなくなってしまうことがあったので、サーバのほうでPHPのエラーログを出力するように設定してみたのでメモ。

php.iniを以下のように変更します。

;error_reporting = E_ALL & ~E_NOTICE
; - Show all errors, except for notices
;error_reporting = E_ALL & ~E_NOTICE | E_STRICT
; - Show only errors
;error_reporting = E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR
; - Show all errors except for notices and coding standards warnings
error_reporting = E_ALL

Eclipseプラグイン「JStyle」

  • 投稿日:
  • by
  • カテゴリ:

eclipse

私の今のPHP開発環境は、Eclipse3.4 + PDTです。

元々EclipseやPDTは英語圏のものなのでしょうがないと言えばしょうがないのですが、全角スペースをきちんと?認識してくれません

ちょっと今日その部分で引っかかって、2時間も時間を取られてしまったので、メモします。

そもそも、プログラムの途中で、全角スペースが入ることなんてないんですよね。

echo " ";

とかいう場合は別ですが。

今回、以下の部分で全角スペースが入っていることに気が付かずにエラーを出して悩んでました。

携帯の機種名を抽出するPHP

  • 投稿日:
  • by
  • カテゴリ:

PHP

今会社で携帯サイトを作っているのですが、その際、携帯の機種毎に振り分ける必要が出てきて、その処理をPHPで作ったのでメモ。

というか、機種名を表示するまでの部分ですが(^^;)

最初に、PHPの、

$_SERVER['HTTP_USER_AGENT'];

で、携帯のUser-Agentが取得できるわけですが、

その文字列によって条件分けします。

ただし、auは機種名ではなく、デバイスIDという特殊な文字列が出てくるので、それを機種名に変更する必要があります。

auに関しては、適宜、デバイスIDを機種名に変換してください。

以下が参考になります。

このスクリプトはTwitter APIの規約に沿っていない可能性がありますので、必ず最新のTwitter利用規約を参照ください。

RSSフィードをTwitterへ投稿するスクリプトです。

同様のサービスで、Twtterfeedがありますが、 このサービスは最大で30分に1回しかRSSを見てくれません。

Twitterはせっかくのリアルタイムなツールなので、ブックマークももっとリアルタイムにしたい!と(^^;)

はてブやその他のブックマークサービスではRSSで出力しているものも多いですし、ブログの更新RSSでも利用できます。

ファイル構成


  • post.php スクリプト本体

  • tmp.tsv 一時保存ファイル(666)

  • ReadMe.txt この記事と同様のことが書かれています。


また以下の外部ライブラリを必要とします。



  • twitteroauth.php

  • OAuth.php



http://github.com/abraham/twitteroauth/tree/master/twitteroauth/

上記URLからダウンロードし、上記本体と同一フォルダに入れてください。

※tmp.tsvはパーミッションを666等にして、書き込めるようにしてください。

基本的にcronで動かすことを前提としております。

以下が利用例です。

(例:5分に1回動かす)

*/5 * * * * /usr/bin/php /yourpath/post.php

最近、本格的にTwitterを初め、ようやくそのおもしろさが分かってきた今日この頃なわたくしです(^^;)

で、ちょっとPHPでTwitter APIを使うにはどのようなすればいいのか、というのを調べていたら、下記のように、たったこれだけで、Twitterに投稿できるfunctionを見つけた。

たったこれだけか!!

function tweet($message, $username, $password){
	$context = stream_context_create(array(
		'http' => array(
		'method'  => 'POST',
		'header'  => sprintf("Authorization: Basic %s\r\n", base64_encode($username.':'.$password)).
			"Content-type: application/x-www-form-urlencoded\r\n",
		'content' => http_build_query(array('status' => $message)),
		'timeout' => 5,
		),
	));
	$ret = file_get_contents('http://twitter.com/statuses/update.xml', false, $context);

return false !== $ret;
}

Amazon Product Advertising APIへ対応する(PEAR)

  • 投稿日:
  • by
  • カテゴリ:

Amazon Product Advertising API

Amazonのアフィリエイト用WEBサービスの名前が、「Amazon Associates Web Service 4.0」から「Amazon Product Advertising API」と変更となり、さらには、今後は使用するのに署名認証が必要となりました。

いままで使っていたマッシュアップや、WEBサービスのスクリプトを変更する必要があります。

私の場合、PHPのPEARライブラリでしたAWSを使用していなかったので、比較的簡単に移行することができました。

まず、スクリプトの変更の前に、新しい署名認証のための「Secret Access Key」を取得する必要があります。

まず以下にアクセスします。


そこで、下図のように「Your Account」から、「Access Identifiers」を選択します。

Amazon Web Services(Yout Account)

Amazon広告スクリプト「lilbox」配布終了

  • 投稿日:
  • by
  • カテゴリ:

Google Adsense

Google Adsenseの代替広告として利用してきた、Amazon広告スクリプト「lilbox」が、Amazon Webサービスの仕様変更に伴い、配布終了になったようです。


  • Amazon広告スクリプト:lilbox


これまでに配布されたlilboxは全て、Amazon Webサービスの仕様変更のため、2009年8月15日を過ぎると動作しなくなります。現在ご利用中の方は期限までに撤去されるようお願いいたします。お手数をお掛けして申し訳ありません。

とのことです。

便利だったんですけどね~。

「CakePHP修行」を追う #8

cakephp-wall

IDEA*IDEAさんのところで以前連載していた、「CakePHP修行」を追って、CakePHPの勉強がてら、自分も同じことをやってみよう、というシリーズです。

過去の記事はこちらのカテゴリーでごらんいただけます。

今回はこちらの記事から。


今回は画面のカスタマイズということで。

(1.2の解釈で)


  • /app/views/layout/default.ctpを作ればそれがデフォルトのレイアウトになる。

  • titleタグの中身はcontroller中に$pageTitleで指定できる。

  • レイアウトは複数作って$layoutで切り替えることができる。

  • レイアウト中の小さなパーツは/app/views/elementsに入れておいて使い回しできる。


ということですね。

CentOS

CentOSにphpMyAdminの最新版を入れようと思ったら、PHP 5.2以降じゃないとダメだとエラーが出てしまいました。なので、PHPを5.2にアップグレードしたメモです。ちなみに、PHPだけやろうとすると依存性の問題でエラーが出たので、ついでにMySQLも5.1.34にアップデートしました。

参考URL


まずは今PHPがどのような状態かを調べる。
# php -v
PHP 5.1.6 (cli) (built: Apr 7 2009 08:00:04)
Copyright (c) 1997-2006 The PHP Group
Zend Engine v2.1.0, Copyright (c) 1998-2006 Zend Technologies

yumではどのようにインストールされているかというと、以下の感じ。

PHPで更新Pingの送信

  • 投稿日:
  • by
  • カテゴリ:

PHP

WordPressやMovableTypeなどのブログシステムでは、更新Pingの送信機能がついていますが、PHPでの自作プロジェクトやスクリプトには更新Pingの機能はありません。また、ただ単にPing機能だけを使いたいという場合もあるでしょう。

そういうときに便利なPHP製のPing送信ツールです。

以下のスクリプトで更新Pingを送信できます。

条件としては、PEARのXML-RPCがインストールされていることです。

良かったら、お使いください。

こちら↓

Shift_JISでスクリプトを書くと危険な文字列

  • 投稿日:
  • by
  • カテゴリ:

私はもっぱらPHPスクリプトを作るときはUTF-8で作成しているのだが、最近会社で、とあるシステムを外注したとき、スクリプトがShift_JISで作ってあり、案の定、文字入力や表示の時に文字化けしてしまっていた。

だから、打ち合わせの時、UTFで作りましょう、って言ったじゃない・・・

ということで、結局本番環境もShift_JISのまま運用が始まってしまい、下記の表で置き換えをする羽目になってしまった・・・

[PHP] 式の前の@(アットマーク)

  • 投稿日:
  • by
  • カテゴリ:

知らなかったので、メモ。

とあるPHPのソースを見ていたら、関数の前に@(アットマーク)が付いていた。なんだこれ?と思って調べてみたら、エラー制御演算子というものらしい。

しらなかった。。。

PHP の式の前に付けた場合、 その式により生成されたエラーメッセージは無視されます。

とのことだ。

よく、ファイル関係の式やデータベース系に使用されるらしい。

XAMPPのApacheプロセスがクラッシュ

  • 投稿日:
  • by
  • カテゴリ:

いつもPHPの開発はWindowsのローカルマシンでやっていて、環境はXAMPPEclipseを使用している。

EclipseではPHPプラグインを入れているので、PHPでのコード変更したらPHPブラウザで随時確認できるという便利さなのだが、CakePHPを開発している時に、XAMPPのApacheプロセスがクラッシュしてしまう現象に悩まされてしまった。

Apacheのエラーログには以下のように出ていた。

[Sat Mar 07 18:07:19 2009] [crit] (22)Invalid argument: unable to replace stderr with error_log
[Sat Mar 07 18:07:19 2009] [crit] (2)No such file or directory: unable to replace stderr with /dev/null
[Sat Mar 07 18:07:22 2009] [crit] (22)Invalid argument: unable to replace stderr with error_log
[Sat Mar 07 18:07:22 2009] [crit] (2)No such file or directory: unable to replace stderr with /dev/null

え??、Windowsに/dev/nullなんてないよ?なんて思いつつ、原因をネットで検索して見るも、あまり参考になる記事は見つからず。

携帯サイト作成のためにphp.iniを見直してみた

  • 投稿日:
  • by
  • カテゴリ:

先日、CakePHPで携帯サイトを作るやり方を書いたのだが、CakePHP内部では文字コードをSJIS-winに変換してくれるのだが、携帯で見てみると、どうしても文字化けしてしまう、という現象に陥ってしまった。

そこで、いろいろ原因を探ってみた。

最初に考えたのはUTF-8のBOM問題

CakePHPのスクリプトはUTF-8で書いていて、それをmb_convert_encodingして、SJIS-winに変換している。そのUTF-8のファイルにBOMがついてしまっているのでは、と思い、以下のサイトを参考にしてみた。


このサイトのように、BOMがついているファイルを使うと、レスポンスヘッダーより前に不要なコード(EF BB BF)が送信され、文字化けを起こしてしまうというものだ。このサイトのスクリプトを参考にSJIS-winに変換した出力バッファーの最初の3バイトを削ってみたが変わらず。

ということは、BOMが原因ではないということだった。

で、よくよく原因を考えてみた。

ちょっと自分が作っているWEBサービスにレコメンデーション機能を付けようかと思い、PHPで使えるものはないかと探していたら、ありました。

logo

その名も、「Vogoo」。


レコメンデーションというのは、Amazonやいろいろなショッピングサイトなどで見られる、「この商品を買っている人はこの商品も購入しています」というようなリストを表示してくれる代物です。

で、このVogooなのですが、PHPのライブラリとして配布されています。ちなみにライセンスはGNU GPL v2以降ということらしいです。

ちょっと会社の案件で、WEBサーバー環境はXAMPPで構築し、データベースはMicrosoftのSQL Serverを使用するという環境を作っていたのだがどうしてもPHPからSQL Serverに接続できない状況になってしまった。。。(なんか以前もこんなエントリーを書いたような気もするが。。。)

これを試した環境では、XAMPPは今現在の最新、1.7.0。SQL Serverは、SQL Server Express Edition 2008である。

原因を調べてみたところ、どうやら「SQL Server Client Library」というものに問題があるようだ。

その実体ファイルは、「ntwdblib.dll」というファイル。

今回は、ジャンルコード検索を実装してみたいと思います。

この連載の過去の記事はこちらを参照してください。

まずは、モデルから。

app/models/Genrecode.php

class Genrecode extends AppModel {

var $name = "Genrecode";

//商品検索APIの共通パラメータ
var $api_def = array(
'developerId' => DEV_ID,
'affiliateId' => AFF_ID,
'operation' => 'GenreSearch',
'version' => '2007-04-11',
);

function findAll($conditions = array()) {

$req = 'http://api.rakuten.co.jp/rws/1.11/rest?';

$api_params = array_merge($conditions,$this->api_def);

uses('Xml');

$req .= http_build_query($api_params);

$xml = new XML($req);
$xml_array = Set::reverse($xml);

return $xml_array['Response']['Body']['GenreSearch'];

}
}