トップ  > メモ一覧  > カテゴリ「pear」の絞り込み結果 : 10件

10件中 1 〜 10 表示  1 

No.3545 {foreach},{foreachelse}

{foreach},{foreachelse}
Prev  Chapter 7. 組み込み関数  Next

{foreach},{foreachelse}

{foreach} を使用して、通常の数値添字配列と同じように 連想配列 をループします。 {section} のように、数値添字の配列のみ をループさせるということはありません。 {foreach} の構文は {section} よりずっと簡単ですが、その代わりに 1つの配列 しか扱えません。すべての {foreach} タグは、 終了タグ {/foreach} とペアである必要があります。

属性名 必須 デフォルト 概要
from array Yes n/a ループに使用する配列
item string Yes n/a 現在の要素を示す変数の名前
key string No n/a 現在のキーを示す変数の名前
name string No n/a foreach プロパティにアクセスするための foreach ループ名
  • 必須の属性は fromitem です。

  • {foreach} ループの name は、英数字とアンダースコアを使用して自由に命名できます。これは PHP の変数 と同じです。

  • {foreach} ループはネスト可能で、ネストした {foreach} の name はお互いにユニークである必要があります。

  • from 属性は、通常は値の配列で、 {foreach} のループ回数を決定するために使われます。

  • {foreachelse} は、 from 変数の値が存在しない場合に実行されます。

  • {foreach} ループは、プロパティを操作する変数を自身で持っています。 これらは次のように表されます。 {$smarty.foreach.name.property} ここで、namename 属性の値となります。

    注意

    name 属性が必要となるのは {foreach} のプロパティにアクセスする必要がある場合のみです。 これは {section} の場合とは異なります。{foreach} のプロパティに対して 定義されていない name でアクセスしてもエラーは発生しませんが、 結果は予測できない値になります。

  • {foreach} のプロパティには indexiterationfirstlastshowtotal があります。

Example 7.5. item 属性

<?php
$arr = array(1000, 1001, 1002);
$smarty->assign('myArray', $arr);
?>

  

$myArray を順序なしリストで出力するテンプレート

<ul>
{foreach from=$myArray item=foo}
    <li>{$foo}</li>
{/foreach}
</ul>

  

出力

<ul>
    <li>1000</li>
    <li>1001</li>
    <li>1002</li>
</ul>

  

Example 7.6. item および key 属性の説明

<?php
$arr = array(9 => 'Tennis', 3 => 'Swimming', 8 => 'Coding');
$smarty->assign('myArray', $arr);
?>

  

$myArray を キー/値 のペアで出力するテンプレート。 PHP の foreach と似ています。

<ul>
{foreach from=$myArray key=k item=v}
   <li>{$k}: {$v}</li>
{/foreach}
</ul>

  

出力

<ul>
    <li>9: Tennis</li>
    <li>3: Swimming</li>
    <li>8: Coding</li>
</ul>

  

Example 7.7. {foreach} で連想配列の item 属性を指定する例

<?php
$items_list = array(23 => array('no' => 2456, 'label' => 'Salad'),
                    96 => array('no' => 4889, 'label' => 'Cream')
                    );
$smarty->assign('items', $items_list);
?>

  

$items$myId を url に出力するテンプレート

<ul>
{foreach from=$items key=myId item=i}
  <li><a href="item.php?id={$myId}">{$i.no}: {$i.label}</li>
{/foreach}
</ul>

  

出力

<ul>
  <li><a href="item.php?id=23">2456: Salad</li>
  <li><a href="item.php?id=96">4889: Cream</li>
</ul>

  

Example 7.8. {foreach} で itemkey をネストする例

配列を Smarty に割り当てます。key にはループする値のキーが含まれます。

<?php
 $smarty->assign('contacts', array(
                             array('phone' => '1',
                                   'fax' => '2',
                                   'cell' => '3'),
                             array('phone' => '555-4444',
                                   'fax' => '555-3333',
                                   'cell' => '760-1234')
                             ));
?>

  

$contact を出力するテンプレート

{foreach name=outer item=contact from=$contacts}
  <hr />
  {foreach key=key item=item from=$contact}
    {$key}: {$item}<br />
  {/foreach}
{/foreach}

  

出力

<hr />
  phone: 1<br />
  fax: 2<br />
  cell: 3<br />
<hr />
  phone: 555-4444<br />
  fax: 555-3333<br />
  cell: 760-1234<br />

  

Example 7.9. データベースを使用する {foreachelse} の例

データベース (PEAR や ADODB など) を検索する例で、クエリの結果を Smarty に割り当てます。

<?php
  $search_condition = "where name like '$foo%' ";
  $sql = 'select contact_id, name, nick from contacts '.$search_condition.' order by name';
  $smarty->assign('results', $db->getAssoc($sql) );
?>

  

結果がない場合に、{foreachelse} を使用して 見つかりません と表示するテンプレート

{foreach key=cid item=con from=$results}
    <a href="contact.php?contact_id={$cid}">{$con.name} - {$con.nick}</a><br />
{foreachelse}
    検索結果が見つかりませんでした
{/foreach}

  

.index

index には、現在の配列のインデックスをゼロから数えた値が含まれます。

Example 7.10. index の例

{* ヘッダブロックを5行おきに出力します *}
<table>
{foreach from=$items key=myId item=i name=foo}
  {if $smarty.foreach.foo.index % 5 == 0}
     <tr><th>タイトル</th></tr>
  {/if}
  <tr><td>{$i.label}</td></tr>
{/foreach}
</table>

  

.iteration

iteration は現在のループが反復された回数を表示します。 index とは異なり、常に 1 から始まります。 各ループごとに 1 ずつ加算されます。

Example 7.11. iteration および index の例

{* この出力は 0|1, 1|2, 2|3, ... のようになります *}
{foreach from=$myArray item=i name=foo}
{$smarty.foreach.foo.index}|{$smarty.foreach.foo.iteration},
{/foreach}

  

.first

first は、現在の {foreach} の反復が最初のものであるときに TRUE となります。

Example 7.12. first プロパティの例

{* 最初の項目には「最新」、それ以外は id を表示します *}
<table>
{foreach from=$items key=myId item=i name=foo}
<tr>
  <td>{if $smarty.foreach.foo.first}最新{else}{$myId}{/if}</td>
  <td>{$i.label}</td>
</tr>
{/foreach}
</table>

  

.last

last は、現在の {foreach} の反復が最後のものであるときに TRUE となります。

Example 7.13. last プロパティの例

{* 一覧の最後に横罫線を追加します *}
{foreach from=$items key=part_id item=prod name=products}
  <a href="#{$part_id}">{$prod}</a>{if $smarty.foreach.products.last}<hr>{else},{/if}
{foreachelse}
  ... コンテンツ ...
{/foreach}

  

.show

show{foreach} のパラメータとして使用します。 show は boolean 値です。 FALSE の場合は {foreach} は表示されず、 もし {foreachelse} が存在すれば、それが代わりに表示されます。

.total

total には、 {foreach} がループするトータル回数が含まれます。 これは、{foreach} の内部だけではなく ループを抜けた後でも使用できます。

Example 7.14. total プロパティの例

{* 返された行の総数を最後に表示します *}
{foreach from=$items key=part_id item=prod name=foo}
{$prod.name}<hr/>
{if $smarty.foreach.foo.last}
  <div id="total">{$smarty.foreach.foo.total} items</div>
{/if}
{foreachelse}
 ... 別の内容 ...
{/foreach}

  

引用元

更新:2011/04/03 22:33 カテゴリ: PHP  > pear ▲トップ

No.2402 phpのキャッシュ機能にpearのCache_Lite()を使用する

phpのキャッシュ機能にpearのCache_Lite()を使用する
 
WebAPI(ウェブサービス)を利用してサイトを構築する場合、負荷・スピードを考えるとWebAPIの結果をキャッシュする事は必須だと言えます。
phpではpearのCache_Liteというキャッシュ機能を実現するモジュールがありますし、php5の標準で装備されているsimplexml_load_fileはxmlファイルを返すwebAPIのリクエストに使えます。
(simplexml_load_file関数はXMLファイルをパースし、オブジェクトに代入します。)

流れ的には以下のようになります。
①キャッシュが存在しない場合はsimplexml_load_file関数でWebAPIリクエストし、レスポンス結果(xml)をSimpleXMLオブジェクトに代入する。
②レスポンス結果のSimpleXMLオブジェクトを表示したいhtmlに変換してそのhtml(文字列)をCache_Liteでキャッシュする。
この辺りの詳細については「phpのキャッシュ機能にpearのCache_Lite()を使用する(phpサンプルプログラム)」に書いていますので参考にしてください。
simplexml_load_fileで取得したxmlオブジェクトがpearのCache_Liteでキャッシュできない
キャッシュするタイミングについてもう少し考えてみます。WebAPIレスポンスのxmlファイルを色々なhtmlに整形したい場合はxmlファイルの状態でキャッシュした方がいいでしょう。
しかし、最初に説明したようにhtmlに変換した状態(ただの文字列)ではCache_Liteでキャッシュすることができますが、 simplexml_load_fileでWebAPIのレスポンス値を取得したSimpleXMLオブジェクトはCache_Liteでキャッシュでき ないようです。
それなら、SimpleXMLオブジェクトをserialize化してからキャッシュしようと考えたのですが、私がネットで調べた範囲ではどうもSimpleXMLオブジェクトのserialize化も無理のようです。
ですので、ここは単純にWebAPIの返すxmlファイルを文字列としてキャッシュしてから処理することにしてみました。流れ的には以下のようになります。
①キャッシュが存在しない場合はfile_get_contents関数でWebAPIリクエストし、xmlファイルを文字列として受け取る。
②①のxml文字列をCache_Liteでキャッシュする。
③simplexml_load_string関数を使ってxml文字列をSimpleXMLブジェクトに変換し以降はこのオブジェクトを扱う。
もちろん、SimpleXMLブジェクトに変換する必要はない、正規表現を使って全部文字列で扱う方がいいという方もいるでしょう。この辺りは好みの問題です。
phpのサンプルプログラム
それでは、以下にphpのサンプルプログラムを示します。

<?php

//Cache_Liteを利用するためのファイル読込み
require_once("Cache/Lite.php");

//リクエストするWebAPIのURL(皆さんの目的のURLをセットしてください)
$requestUrl = "";
//xmlファイルの内容を受け取る文字列変数
$xmlStr = "";

//キャッシュオプションを設定した変数の作成
$cacheOptions = array(
'cacheDir' => './cache/', //キャッシュディレクトリをcacheに設定
'lifeTime' => '600', //キャッシュデータ保持する時間を10分間に設定(秒単位)
);

//キャッシュID設定(ID毎にキャッシュする。ここではキャッシュIDを固定(testId)していますが、実用性を考えるとこの変数は動的に扱うことになると思います。)
$cacheId = "testId";
//Cache_Liteオブジェクト生成
$Cache_Lite = new Cache_Lite($cacheOptions);
//$Cache_Lite->get($cacheId)で指定したIDの有効なキャッシュデータがキャッシュディレクトリに存在するかどうかを返す。
if($data = $Cache_Lite->get($cacheId)){
//有効なキャッシュがある場合の処理
//キャッシュデータを変数にセット
$xmlStr = $data;
}else{
//有効なキャッシュがない場合の処理
//APIリクエストする
$xmlStr = @file_get_contents($requestUrl);
//キャッシュ保存
$Cache_Lite->save($xmlStr,$cacheId);
}
//xml文字列をsimpleXmlオブジェクトに変換
$xmlData = simplexml_load_string($xmlStr);
//以降xmlオブジェクト($xmlData)を処理する


?>

プログラムの詳細については各コメントを参考にしてください。
サンプルプログラムではキャッシュする保存場所をcacheディレクトリに指定していますので、事前にcacheディレクトリを作成して書込み権限を与えておく必要があります。
以上です

PEARのCache_Liteでオブジェクトもキャッシュ&古いキャッシュも利用する

 Webサービスを利用中。file_get_contentsで取得したデータをキャッシュするのにいろいろ、はまった話。

PEAR入門 PHP標準ライブラリを極める! PEARのマニュアル「Manual :: Cache_Lite の導入」を参考に試す。

 まずは、WebサービスのAPIで取得したオブジェクトをキャッシュしようとする。

 キャッシュファイルが生成されているのでsaveはうまくいったように見えるのだが、getがうまくいかない。オブジェクトをキャッシュしているからのようだ。文字列ではないとダメってことのようで。
調べてみるとオプションで「automaticSerialization」をTRUEにするといいようだ。「自動シリアライズの有効/無効を指定します (文字列ではない形式のデータを保存できるようになりますが、 動作は多少遅くなります)。 」とある。
なるほど。見逃してた。

 調べてる最中に見つけた「WebAPIで取得したxmlファイルをpearのCache_Liteを使ってキャッシュする」の話も、このオプションを指定することでうまくいくのではないか? とか思ったり。simplexml_load_fileを試してないのでわかりませんが。

 次。キャッシュにヒットしなかった場合(あるいはキャッシュがすでに古い場合)、新たにWebサービスからデータを取得するわけだが、それがうまくいかなかった場合はどうするか?

 再度取得の処理を繰り替えすことは、さらにWebサービスへの負荷を増すことになる。それは避けたい。

 そして、今回試しているWebサービスはキャッシュの保持時間を1日にしろ、と言っている。
古い情報を提供することはユーザー(この場合、Webサービスを使った野良サービスを使うユーザー)と元のWebサービスを提供する側にとって不利益になるからだろう。

 で、考えたのはこういう方法。

 まず、通常、取得できたデータはキャッシュする。これを便宜的に「新しいキャッシュ」としよう。
再度そのデータを利用したい場合、リクエストがあったら、1日以内であればその新しいキャッシュを利用する。

 1日を過ぎていた場合は、新たにデータを取得する処理を行う。
しかし、それができなかった(Webサービス側がエラーを返す、または、リクエストを処理できない)場合は、1日を過ぎていたデータもキャッシュとして利用する(これを便宜的に「古いキャッシュ」とする)。
取得ができないのはしょうがない、相手側の負荷を軽減するのだから古いキャッシュの利用もやむなし、というのと、「データが取得できませんでした」なんていう間抜けなメッセージを出したくないという理由からだ。

 Cache_Lite コアクラスのコンストラクタのオプションにはキャッシュ生存期間「lifeTime」が指定できる。通常、この場合は1日(86400秒)を指定するわけだ。これで新しいキャッシュの利用は実現できる。
しかし、上記理由から古いキャッシュも利用したい場合にはこれでは対処できない。

 そこで、まず、キャッシュをgetする場合は86400とする。
新しいキャッシュがgetできなければ、新たにWebサービスからデータを取得。それができなければ、古いキャッシュを利用するのだが、それにアクセス する場合は新たに「lifeTime」をもっと長い時間にしたオブジェクトを生成してgetする。これで古いキャッシュも利用できる。

 キャッシュのクリアは別に行う。新しいキャッシュを利用する際のコンストラクタのオプションでautomaticCleaningFactor(自動クリーニングプロセスの無効/設定を指定)は指定しないでおくというわけだ。

 というわけでなんとか、想定していた動作は実現できた。まあ、想定外のことはいくらでも起きうるので、しばらく様子を見てみよう。

引用元

更新:2010/05/04 14:56 カテゴリ: PHP  > pear ▲トップ

No.1751 文字数丸めて表示

<td>({$commu.name|truncate:60})</td>
更新:2009/11/19 17:07 カテゴリ: PHP  > pear ▲トップ

No.1715 Pear::Logを使う

Pear::Logを使う

<?php
require_once 'Log.php';

$logfile = './log_file';
$log = Log::singleton('file', $logfile, null, null, PEAR_LOG_DEBUG);

$log->debug('デバッグログを出力します');
$log->info('情報ログを出力します');
$log->notice('お知らせログを出力します');
$log->warning('警告ログを出力します');
$log->err('エラーログを出力します');
$log->crit('危機的エラーログを出力します');
$log->alert('緊急エラーログを主力します');
$log->emerg('システムが安全でない場合の警告ログを出力します');

オブジェクト生成時のパラメータの1つ目には、ログ出力方法を指定できる。

パラメータ 詳細
console コンソールに出力
display ブラウザに出力
error_log PHPのerror_log関数を利用して出力
file ファイルに出力
mail メールで送信
null 何もしない
sql DBのテーブルに出力
sqllite SQLiteのテーブルに出力
syslog システムのロギングサービスに出力
window ブラウザの別ウィンドウに出力

参考 : 634 - Pear - Log

$name(String):
ログ出力のリソース名を指定します。指定する値はハンドラのタイプによって異なります。
例:file:ファイル名、sql:テーブル名

$ident(String):
ログ出力用のインスタンスを一意に識別するためのIDを指定します。
IDはログメッセージと共に出力され、たくさんのログメッセージから目的のメッセージを識別する手助けとなります。
$conf(Array):
連想配列を利用して、ハンドラに対する特殊な設定を指定します。
例:file:array("mode" => 0600, "timeFormat" => "%X %x");

$level(Integer):
ログレベルを指定します。指定には、あらかじめ用意されている定数を利用します。

指定するログレベル一覧。 err()
定数 ショートカット 利用目的
PEAR_LOG_EMERG emerg() システムに対して安全ではない場合の警告
PEAR_LOG_ALERT alert() 対応に急を要する警告
PEAR_LOG_CRIT crit() 危機的な状況を知らせる警告
PEAR_LOG_ERR   エラーの発生
PEAR_LOG_WARNING warning() 重要な警告
PEAR_LOG_NOTICE notice() 重要ではない警告
PEAR_LOG_INFO info() お知らせ
PEAR_LOG_DEBUG debug() デバッグ

2種類のログ出力方法

2種類のログ出力方法があります。

レベル別のメソッドを利用

出力するレベルごとにメソッドを使い分けます。
$log->debug("message1");
$log->error("message2");
メソッド一覧は前述の表を参照してください。

共通メソッドを利用

Log::logメソッドを利用して、どのログレベルの場合でも、同じメソッドで出力することができます。
$log->log("message1", PEAR_LOG_DEBUG);
$log->log("message2", PEAR_LOG_ERR);
指定する定数は前述の表を参照してください。

リンク

引用元

更新:2009/11/08 03:25 カテゴリ: PHP  > pear ▲トップ

No.1371 pear::DB の基本

require_once 'DB.php';

$dsn = 'mysqli://root:hogehoge@localhost/check_data_size';

$db = DB::connect($dsn);
if (PEAR::isError($db)) {
    die($db->getMessage());
}

//print('接続に成功しました');

更新:2009/08/25 09:57 カテゴリ: PHP  > pear ▲トップ

No.1369【引用】MDB2 を使う

接続
 次のようにMySQLに接続します。 MDB2::connect の引数は、「 'mysqli://ユーザ名:パスワード@ホスト/データベース名?charset=文字コード' 」です(接続に失敗するとエラーが表示されます)。

require_once 'MDB2.php' ; //ライブラリのロード

$db=MDB2::connect( 'mysqli://test:pass@localhost/mydb?charset=utf8' );
if (PEAR::isError($db)) die ( "<p>{$db->getMessage()}</p>" ); //エラー処理

エラーになる場合

PEAR_Error (あるいは MDB2_Error ...

引用元

更新:2009/08/25 09:36 カテゴリ: PHP  > pear ▲トップ

No.1044 pear install XML_Serializer

pear install XML_Serializer
更新:2009/06/15 09:38 カテゴリ: PHP  > pear ▲トップ

No.727 pearコマンド基本

◆ペアの情報取得
pear config-show
更新:2009/03/13 19:18 カテゴリ: PHP  > pear ▲トップ

No.619 pearコマンドをとりあえず使う

(例)
php /usr/share/pear/pearcmd.php list
本当は
php /usr/share/pear/pearcmd.php にpearのエイリアスをする

更新:2008/12/26 10:04 カテゴリ: PHP  > pear ▲トップ

No.582 pearのyumインストール

yum install php-pear
更新:2008/12/07 08:23 カテゴリ: PHP  > pear ▲トップ
10件中 1 〜 10 表示  1 

FuelPHP

Mac

フロントエンド開発

web開発

プロマネ

マネタイズ

プレゼン

webサービス運用

webサービス

Linux

サーバ管理

MySQL

ソース・開発

svn・git

PHP

HTML・CSS

JavaScript

ツール, ライブラリ

ビジネス

テンプレート

負荷・チューニング

Windows

メール

メール・手紙文例

CodeIgniter

オブジェクト指向

UI・フロントエンド

cloud

マークアップ・テキスト

Flash

デザイン

DBその他

Ruby

PostgreSQL

ユーティリティ・ソフト

Firefox

ハードウェア

Google

symfony

OpenPNE全般

OpenPNE2

Hack(賢コツ)

OpenPNE3

リンク

個人開発

その他

未確認

KVS

ubuntu

Android

負荷試験

オープンソース

社会

便利ツール

マネー

Twig

食品宅配

WEB設計

オーディオ

一般常識

アプリ開発

Python

サイトマップ

うずら技術ブログ

たませんSNS

rss2.0