PHPプログラムに関する各種メモ書き:タグ「ファイル」での検索

PHPでFTPファイルアップロード / ダウンロード を行う【flysystem】

PHPでFTPファイルアップロード / ダウンロード を行うには PHPのFTP関数 http://php.net/ftp を使用する方法がありますが、

■ flysystem

https://packagist.org/packages/league/flysystem

を使用するほうが早く、FTPをはじめとする次の転送方式にも同じインターフェイスで対応できます(要 追加インストール)

  • local
  • Amazon Web Services - S3 V2 / V3
  • Rackspace Cloud Files
  • Dropbox
  • OneDrive
  • Copy
  • ftp
  • Sftp
  • Zip
  • WebDAV
  • PHPCR
  • Azure Blob Storage
  • NullAdapter
  • Redis
  • Fallback
  • Memory
  • Google Cloud Storage
  • SinaAppEngine Storage

1. インストール

composer からインストールします

composer require league/flysystem

2. 読み込み(autoload.php)

autoload.php を読みこませればOK

autoloadを使いたくない場合は次のように spl_autoload_register() に無名関数を登録してオートロードを作成します。

spl_autoload_register(function($class) {
    $prefix = 'League\\Flysystem\\';
    if ( ! substr($class, 0, 17) === $prefix) {
        return;
    }
    $class = substr($class, strlen($prefix));
    $location = __DIR__ . 'path/to/flysystem/src/' . str_replace('\\', '/', $class) . '.php';
    if (is_file($location)) {
        require_once($location);
    }
});

3.ファイルシステムへの接続

(ローカル)

use League\Flysystem\Filesystem;
use League\Flysystem\Adapter\Local as Adapter;
$filesystem = new Filesystem(new Adapter('/path/to/directory'));

(FTP)

use League\Flysystem\Adapter\Sftp as Adapter;
$filesystem = new Filesystem(new Adapter(array(
    'host' => 'example.com',
    'port' => 21,
    'username' => 'username',
    'password' => 'password',
    'privateKey' => 'path/to/or/contents/of/privatekey',
    'root' => '/path/to/root',
    'timeout' => 10,
)));

4. ファイルの操作

// ファイルの存在確認
$exists = $filesystem->has('path/to/file.txt');
// ファイルを読み込む
$contents = $filesystem->read('path/to/file.txt');
// ファイルを読み込むストリームを得る
$stream = $filesystem->readStream('something/is/here.ext');
// ファイルに書き込む
$filesystem->write('path/to/file.txt', 'contents');
// ファイルに追記する
$filesystem->put('path/to/file.txt', 'contents');
// ファイルを削除する
$filesystem->delete('path/to/file.txt');
// ファイルを読み込んで削除する
$contents = $filesystem->readAndDelete('path/to/file.txt');
// ファイルをリネーム(移動)する
$filesystem->rename('filename.txt', 'newname.txt');

5. ftp_connect() 関数がありませんエラーが出る場合

Fatal error: Call to undefined function League\Flysystem\Adapter\ftp_connect() in vendor/league/flysystem/src/Adapter/Ftp.php on line 98

この場合はPHPのftp関数が使用できないサーバですので使用できません。 ソケット通信を使用したFTPクラスを使用するといいでしょう

https://gist.github.com/kobapan/97dcf3039366be1f326d

No.1009
03/04 11:57

edit

ファイル

PHPでファイルを開いて1行ずつ読み込む、ファイルへデータを書き出す。(ファイルオープン、クローズ)

■ PHPでファイルを開いて1行ずつ読み込むのサンプル

$filename = 'input.txt';
$fp = fopen($filename,'r') or die("ファイル({$filename})のオープンに失敗しました");
while ( ($line = fgets($fp,99999)) !== false ) { // 1行あたり最大99999bytes
	print "$line\n";
}
fclose($fp);

■ ファイルへの書き込みは

$filename = 'output.txt';
$data = 'テストデータです';
$tmp_filename = getmypid().'.tmp';
$fp = fopen($tmp_filename, 'w');
fwrite($fp, $data);
fclose( $fp );
rename($tmp_filename, $filename);
No.544
01/27 15:45

edit

ファイル

テンプレートエンジンTwigに自作フィルタを追加する

Twigに自作フィルタを追加するにはフィルタを定義して addFilter するだけでOKです。

例 : ファイルの存在をチェックする file_exists フィルタを追加する(PHPファイル内に以下を追加)

$filter = new Twig_SimpleFilter('file_exists', function ($filename) {
	// ディレクトリは適宜書き換えること
	return file_exists(dirname(__FILE__)."/{$filename}");
});
$twig->addFilter($filter);

使い方(HTML内で以下のように記述)

{% if "test.jpg"|file_exists  %}
	ファイルが存在します
{% else %}
	ファイルは存在しません
{% endif %}
No.955
07/02 14:18

edit

Twig
ファイル

PHPでファイルをダウンロードさせる

PHPでファイルをダウンロードさせるにはブラウザにダウンロードファイルを知らせるためのヘッダとファイル名を送ります

例 : test.csv というファイル名でダウンロードさせる

header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=test.csv");
print 'ファイル内容';
No.932
04/20 16:24

edit

ファイル

PHPで安全なファイルロック

PHPでファイルロック(排他制御)をするのは標準の flock 関数が簡単で有効です。
しかし flock関数はサーバーによっては正常動作しない(排他制御が出来ない、またはロックしたままプロセスが死 ぬとロック解除が出来ない)ことがまれにあります。(サーバーによります。)
ですのでPHPスクリプトをアップロードする先のサーバーが flock が正常に動作するか毎回確認しないといけませ ん。
また flock関数ではロックのトライ時間(タイムアウト時間)を自由に設定することができません。
そこで Perlメモ( http://is.gd/cKqS11 )の有名なファイルリネーム方式のファイルロックを採用します。
すでにPHPに移植されている方がいるのでそこから引用( http://is.gd/rj4aOc )

● ダウンロード

http://logic.moo.jp/data/filedir/834_3.zip

● 使い方

require_once('exfilelock.php');
$exfl = new exfilelock();
$exfl->flock() or die('ERROR : LOCK ERROR');

// ここに排他制御して実行したい何かしらの処理を記述

$exfl->unflock() or die('ERROR : UNLOCK ERROR');

**ファイルロックのテストスクリプト

test_filelock.php:ロックを使ったカウンターアップのテスト

ファイルを解凍してできるディレクトリ「data」「lockdir」のパーミッションを777にして abで同時に100並列実行します。 カウンターが正常に10000までいけばOK。

ab -n 100 -c 100 http://mitoite.net/test/php_mailform/php_mailform.php?cmd=append_imap
添付ファイル1
添付ファイル2
No.834
05/12 13:48

edit

添付ファイル

ファイル

画像ファイルの width, height を取得して挿入するSmarty Plugin

画像ファイルの width, height を取得して挿入するSmarty Plugin

ファイル名 : modifier.image_wh.php で保存

<?php
function smarty_modifier_image_wh($file_name='') {
    if (! $file_name ) { return "error:{$file_name}"; }
    if (!is_file($file_name)) { return "error:{$file_name}"; }
    list($width, $height, $type, $attr) = getimagesize($file_name);
    if ($width && $height){
        return 'width="' .$width. '" height="'.$height.'"';
    }
    else{
        return "error: can not get width height:{$file_name}";
    }
}

使い方

<img src="{$image_file}" {$image_file|image_wh} />{/if}

とすると width="100" height="200" といった情報が入ります。

なお変数に入ったディレクトリも指定する場合は

{$image_file|image_wh}
  ↓
{"`$data_dir`/`$image_file`"|image_wh}

とします。


No.833
01/05 11:43

edit

Smarty
画像
ファイル

PHPでURLからローカルにファイルをダウンロードする

PHPでURLからローカルにファイルをダウンロードするには以下のようにします。

function file_download($url, $dir='.', $save_base_name='' ){
	if ( ! is_dir($dir) ){ die("ディレクトリ({$dir})が存在しません。");}
	$dir = preg_replace("{/$}","",$dir);
	$p = pathinfo($url);
	$local_filename = '';
	if ( $save_base_name ){ $local_filename = "{$dir}/{$save_base_name}.{$p['extension']}"; }
	else{ $local_filename = "{$dir}/{$p['filename']}.{$p['extension']}"; }
	if ( is_file( $local_filename ) ){ print "すでにファイル({$local_filename})が存在します<br>\n";}
	$tmp = file_get_contents($url);
	if (! $tmp){ die("URL({$url})からダウンロードできませんでした。");}
	$fp = fopen($local_filename, 'w');
	fwrite($fp, $tmp);
	fclose($fp);
}

実行は

// ■1. ファイル名「hogehoge.jpg」でディレクトリ「images」に保存する場合
file_download('http://www.xxx.xxx.jp/hogehoge.jpg', 'images');

// ■2. ファイル名「0001.jpg」でディレクトリ「images」に保存する場合
file_download('http://www.xxx.xxx.jp/hogehoge.jpg', 'images', '0001');
No.825
01/19 16:51

edit

ファイル

PHPでumaskの設定を行う

UNIX系OSでファイルの処理を行うときに必ず気を付けないといけないのがumask。

これはファイル処理を行うときのパーミッション(権限)を指定しておくものです。

まずumaskの確認

printf ("%03o",umask());

結果

022

と帰ってくることが多いと思います。

この状態で新規ファイルを作成するとパーミッションは【644】となります。

新規に作成するファイルのパーミッションを【666】にしたければ

あらかじめ

umask(0000);

としておけばいいでしょう。

No.776
04/11 18:31

edit

ファイル

Smartyキャッシュを削除する

Smartyキャッシュを削除するには clear_cache(); を使用します。

void clear_cache(string template,
                 string cache_id,
                 string compile_id,
                 int expire_time);

Smartyを使用したサイトではSmartyキャッシュを使用することにより劇的に高速化されますが、(テストページや一時的に表示したページの)キャッシュファイルをクリアし忘れると、逆にハードディスクに負荷をかけて動作を遅くするおそれがあります。

古い不要キャッシュの削除は必ず行いましょう。

Smarty Cache時間による自動削除の例

// 7日以上古いキャッシュを削除する
$days = 7;
$time = $days * 24 * 60 * 60;
// 10回に1回実行
if( rand(1,10)==1 ){ $smarty->clear_all_cache($time); }

ファイルを使用せずキャッシュにMySQLを使用する

http://www.smarty.net/docsv2/ja/section.template.cache.handler.func.tpl

No.761
08/23 10:43

edit

Smarty
ファイル
高速化

phpで画像ファイルの拡張子を判別する

phpで画像の拡張子を判別するには

$i = getimagesize($move_filename);
print_r($i);

結果

Array
(
    [0] => 192
    [1] => 273
    [2] => 2
    [3] => width="192" height="273"
    [bits] => 8
    [channels] => 3
    [mime] => image/jpeg
)

と帰ってきますので、[mime]のところをみればいいでしょう。


No.751
10/19 09:31

edit

ファイル
画像

ファイルアップロードのファイル要領制限(upload_max_filesize)を変更する。

1. .htaccess に記述する場合

#  ファイルアップロードの最大サイズを 10Mに設定
php_value upload_max_filesize 10M
#  ファイルアップロードの最大サイズを 500Kに設定
php_value upload_max_filesize 500K

2. php.ini 内に記述する場合(さくらのレンタルサーバはこちらの方法です。)

;ファイルアップロードの最大サイズを 10Mに設定
upload_max_filesize = 10M

3. phpスクリプト内に記述する場合(サーバの設定によっては許可されていない場合があります)

// ファイルアップロードの最大サイズを 10M に設定
ini_set('upload_max_filesize', 10 * 1024 * 1024); 

● なお現在のファイルアップロード制限の設定を取得するには

print "upload_max_filesize: " . ini_get('upload_max_filesize')." Bytes です。";

とします。

No.690
02/12 16:29

edit

ファイル
.htaccess
メモリ
エラー対処

ZIP Archive のインストール

ZIPファイルを扱う pecl拡張をインストールする。

root になって

yum install php-devel
yum install zlib-devel
pecl install zip

でインストール完了。

完了すると

You should add "extension=zip.so" to php.ini

と表示されるので

/etc/php.ini に【extension=zip.so】を追加。

apacheの再起動をします

apachectl graceful

確認は phpinfo() で出来ます。

pecl拡張がインストールできない環境の場合

http://phpspot.org/blog/archives/2007/10/phpzip.html


■ phpmyadmin(GPLライセンス)のライブラリを使用する

http://winofsql.jp/VA003334/phpVarious060803234456.htm

No.640
11/04 14:58

edit

ファイル

PHPであるディレクトリ(フォルダ)内のファイルを全て削除する

PHPであるディレクトリ(フォルダ)内のファイルを全て削除するには

function delete_allfile($dirpath=''){
	if ( strcmp($dirpath,'')==0 ){ die('delete_allfile : error : please set dir_name'); }
	$deleted_list = array();
	$dir = dir($dirpath);
	while ( ($file=$dir->read()) !== FALSE ){
		if (preg_match('/^\./',$file)){ continue; }	// skip dir , skip hidden file
		else {
			array_push($deleted_list, $file);
			if ( ! unlink("$dirpath/$file") ){ die("delete_allfile : error : can not delete file [{$dirpath}/{$file}]"); }
		}
	}
	return $deleted_list;
}
$deleted_list  = delete_allfile(ディレクトリ名);

で実行

No.608
07/03 11:56

edit

ファイル

ファイル名からパス名、ファイル名、拡張子を調べる。また拡張子を取り除く

意外と何度も調べてしまうのでメモ

■ ファイル名からパス名、ファイル名、拡張子を調べるには pathinfo 関数を使用します

$p = pathinfo('./aaa/bbb/ccc/ddd.jpg');
print_r($p);
// 実行結果
Array
(
    [dirname] => ./aaa/bbb/ccc
    [basename] => ddd.jpg
    [extension] => jpg
    [filename] => ddd
)

ただし、拡張子がないときは $p['extension'] がセットされて帰ってこないので注意。

■ PHPでファイル名から拡張子を取り除くには

■ 1. 拡張子がわかっている場合

basename ("ファイル名","サフィックス");

とします。

$test=basename ( "hogehoge.jpg",".jpg" );

■ 2.拡張子がわかってない場合

関数を定義するのがいいでしょう(か?)

function _delete_extention( $string='' ){
$p = pathinfo($string);
return basename ( $string, ".{$p['extension']}" );
}

No.528
09/07 09:32

edit

ファイル

メモリエラー「PHP Fatal error: Allowed memory size of 8388608 bytes exhausted」

CSVで大きなファイルをコンバート中にメモリエラー

PHP Fatal error: Allowed memory size of 8388608 bytes exhausted

が発生。

このエラーはメモリ不足なので、PHPの最大使用メモリを増やしてあげると回避できます。

下記の例では200MBytesに設定しています。

対処法 1.

/etc/php.ini の設定を以下のように変える

memory_limit = 200M      ; Maximum amount of memory a script may consume (8MB)

対処法 2.

PHPプログラム内に下記コードを記述する

ini_set('memory_limit', '200M');
No.472
09/18 18:05

edit

ファイル
メモリ

PHPでファイルの移動を行う

PHPでファイルの移動を行う

PHPでファイル移動の関数が見あたらなかったので以下のようにする

function move( $from, $to ){
    if ( copy ($from, $to) ){
        unlink($from);
        return TRUE;
    }
    else{
        return FALSE;
    }
}
No.460
11/04 15:01

edit

ファイル