さくらにPEARをインストールする-GUIではうまくいかなかったのでCUIでいれてみた

ググったらけっこう情報古くて使えなかったので、自分用メモです。
デフォルトの設定で説明しています。
PEARの使い方とかセキュリティに関してはググってくださいw

環境

  • さくらスタンダードプラン
  • PHP:5.3.9

WinXP.SP3でTera Term(ターミナルシュミレーター)を使いました。

PEARのインストール

// ダウンロード
%wget http://pear.php.net/go-pear.phar
// ファイル名変更
%mv go-pear.phar go-pear.php
// 実行
%php go-pear.php

1. Installation base ($prefix)                   : /home/あなたのアカウント/pear
 2. Temporary directory for processing            : /tmp/pear/install
 3. Temporary directory for downloads             : /tmp/pear/install
 4. Binaries directory                            : /home/あなたのアカウント/pear/bin
 5. PHP code directory ($php_dir)                 : /home/あなたのアカウント/pear/share/pear
 6. Documentation directory                       : /home/あなたのアカウント/pear/docs
 7. Data directory                                : /home/あなたのアカウント/pear/data
 8. User-modifiable configuration files directory : /home/あなたのアカウント/pear/cfg
 9. Public Web Files directory                    : /home/あなたのアカウント/pear/www
10. Tests directory                               : /home/あなたのアカウント/pear/tests
11. Name of configuration file                    : /home/あなたのアカウント/.pearrc

「9.Public Web Files directory」を「/home/あなたのアカウント/www」に変更(pear/をトル)

あとは「Y」と「Enter」を押すところが1箇所づつありました。

// PEARのリスト表示
%pear list
Installed packages, channel pear.php.net:
=========================================
Package          Version State
Archive_Tar      1.3.7   stable
Console_Getopt   1.3.0   stable
PEAR             1.9.4   stable
Structures_Graph 1.0.4   stable
XML_Util         1.2.1   stable

さくらコンパネの「php.ini」の設定

以下を設定

language = "Japanese"
mbstring.internal_encoding = "UTF8"
mbstring.encoding_translation = Off
allow_url_fopen = On
allow_url_include = On
file_uploads = On
include_path=".:/home/あなたのアカウント/pear/share/pear"

で、動きました。

PHP file_get_contentsでpost送信、file_put_contentsはないのか?!

「file_get_contents」でpost送信する場合、「stream_context_create」がよく例に出てきているのですが、なぜかうまくいかなかったので、ググると、「file_put_contents」を関数にしてくれている方がいらっしゃいました。
本当に感謝です。

http://www.php.net/manual/ja/function.file-get-contents.php#80435

function file_post_contents($url,$headers=false) {
    $url = parse_url($url);

    if (!isset($url['port'])) {
      if ($url['scheme'] == 'http') { $url['port']=80; }
      elseif ($url['scheme'] == 'https') { $url['port']=443; }
    }
    $url['query']=isset($url['query'])?$url['query']:'';

    $url['protocol']=$url['scheme'].'://';
    $eol="\r\n";

    $headers =  "POST ".$url['protocol'].$url['host'].$url['path']." HTTP/1.0".$eol.
                "Host: ".$url['host'].$eol.
                "Referer: ".$url['protocol'].$url['host'].$url['path'].$eol.
                "Content-Type: application/x-www-form-urlencoded".$eol.
                "Content-Length: ".strlen($url['query']).$eol.
                $eol.$url['query'];
    $fp = fsockopen($url['host'], $url['port'], $errno, $errstr, 30);
    if($fp) {
      fputs($fp, $headers);
      $result = '';
      while(!feof($fp)) { $result .= fgets($fp, 128); }
      fclose($fp);
      if (!$headers) {
        //removes headers
        $pattern="/^.*\r\n\r\n/s";
        $result=preg_replace($pattern,'',$result);
      }
      return $result;
    }
}

PHPのsimple_xmlで@にアクセスする方法

ヤフー知恵袋のAPIやってたら、simple_xmlで@にアクセスする方法が分かりませんでした。
以前ヤフオクのAPIやってて、同じ問題で分からなかったので、phpserealizeを使いましたが、知恵袋はphpserializeがないので、xmlを使うことになりました。

SimpleXMLElement Object
(
    [@attributes] => Array
        (
            [totalResultsReturned] => 2
            [totalResultsAvailable] => 44597
            [firstResultPosition] => 1
        )

「$parsed_xml->@attributes->totalResultsReturned」や「$parsed_xml->attributes->totalResultsReturned」とアクセスしても、当然うまくいきませんでした。

正解

$parsed_xml->attributes()->totalResultsReturned

PHPのsimplexmlでCDATAが取得できない。。。

$response = file_get_contents($url);
$parsed_xml = simplexml_load_string($response);

と、するとCDATAが空です。
なので、

$response = file_get_contents($url);
$parsed_xml = simplexml_load_string($response, 'SimpleXMLElement', LIBXML_NOCDATA);

第2、第3引数に「’SimpleXMLElement’, LIBXML_NOCDATA」を追加すると取得できるようになります。