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

PHPでファイルやディレクトリの入ったディレクトリごと削除する

	/**
	 * 中にファイルやディレクトリが入っているディレクトリごと削除する
	 * @param   string      $dir	削除するディレクトリ
	 * @param   boolean     $is_delete_myself	指定したディレクトリ自身を削除するか
	 * @return  string     削除したファイルやリストの結果
	 */
	function remove_directory( $dir, $is_delete_myself=false )
	{
		$result_message = "";
		if ( ! is_dir($dir) ){
			return "ディレクトリ ({$dir}) は存在しません\n";
		}
		else{
			$dir = preg_replace("{/$}","",$dir);
		}

		if ($handle = opendir("$dir")) {
			while (false !== ($item = readdir($handle))) {
				if ($item != "." && $item != "..") {
					if (is_dir("$dir/$item")) {
						$r = remove_directory("$dir/$item", true);
						$result_message .= $r;
					} else {
						unlink("$dir/$item");
						$result_message .= " remove [fie] $dir/$item\n";
					}
				}
			}
			closedir($handle);
			if ( $is_delete_myself == true ){
                rmdir($dir);
                $result_message .= " remove [directory] $dir\n";
            }
		}
		return $result_message;
	}

削除を実行する(指定したディレクトリ自身も削除する)

$r = remove_directory("./my_dir/", true);
echo $r;

結果例

 remove [fie] ./my_dir/b00009vxzx_1.jpg
 remove [fie] ./my_dir/b01lxs5b8x_1.jpg
 remove [fie] ./my_dir/b01lxs5b8x_2.jpg
 remove [fie] ./my_dir/b01lxs5b8x_3.jpg
 remove [directory] ./my_dir

引用元 : https://goo.gl/Z7MFkC

No.1258
06/26 15:43

edit

ファイル

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行ずつ読み込み( SplFileObject )

$file = new SplFileObject(__DIR__ . '/input.html', 'r');
$file->setFlags(SplFileObject::SKIP_EMPTY | SplFileObject::DROP_NEW_LINE);

foreach ($file as $n => $line) {
    if ($line === false) {
        continue;
    }
    echo "$n $line", PHP_EOL;
}

● 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);

● PHPで新規ファイルへの書き込み

$filename = 'output.txt';
$data = 'テストデータです';
$tmp_filename = getmypid().'.tmp';
$fp = fopen($tmp_filename, 'w');
fwrite($fp, $data);
fclose( $fp );
@mkdir(dirname($filename), 0755, true); // ディレクトリ がなければ自動で作成
rename($tmp_filename, $filename);
No.544
09/06 16:38

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 )

● ダウンロード

https://pgmemo.tokyo/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で画像ファイルの拡張子を判別する

1. phpで画像の拡張子を取得するには

$ext = pathinfo($filename, PATHINFO_EXTENSION);

2. phpでファイルのディレクトリを取得するには

$ext = pathinfo($filename, PATHINFO_DIRNAME);

3. phpでファイルの拡張子を取り除いたファイル名を取得するには

$filename_only = pathinfo($original_file_name, PATHINFO_FILENAME);

です。

No.751
07/20 15:52

edit

ファイル
画像

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

PHPのファイルアップロードのファイル要領制限を変更するには次の3つのパラメーターを調整する必要があります。 (必ずしも3つの値を揃える必要はありません)

upload_max_filesize = 256M
post_max_size = 256M
memory_limit = 256M

● 1. php.ini 内に記述する場合

upload_max_filesize = 256M
post_max_size = 256M
memory_limit = 256M

● 2. .htaccess に記述する場合

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

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

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

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

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

とします。

No.690
06/03 11:00

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

ファイル

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

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

● ファイル名から拡張子を調べる

echo pathinfo('./aaa/bbb/ccc/ddd.jpg', PATHINFO_EXTENSION);

結果

jpg

● ファイル名からパス名(ディレクトリ名)を調べる

echo pathinfo('./aaa/bbb/ccc/ddd.jpg', PATHINFO_DIRNAME);

結果

./aaa/bbb/ccc

● パス・ファイル名からパス名(ディレクトリ名)を取り除いたファイル名を調べる

echo pathinfo('./aaa/bbb/ccc/ddd.jpg', PATHINFO_BASENAME);

結果

ddd.jpg

● ファイル名から「ディレクトリ名・拡張子」を取り除いたファイル名を調べる

echo pathinfo('./aaa/bbb/ccc/ddd.jpg', PATHINFO_FILENAME);

結果

ddd

● 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
04/03 17:01

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 = 500M      ; Maximum amount of memory a script may consume (8MB)

ギガバイト表記も使えます (4ギガにしたい場合)

memory_limit = 4G      ; Maximum amount of memory a script may consume (8MB)

● 対処法 2.

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

ini_set('memory_limit', '200M');
No.472
07/02 08:55

edit

ファイル
メモリ

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

● rename関数

rename( $from, $to ) or die("can not move:{$from}:{$to}");

または次のように関数を作ってもいいですか少々遅いと思います。

function move( $from, $to ){
    if ( copy ($from, $to) ){
        unlink($from);
        return true;
    } else{
        return false;
    }
}
No.460
06/16 19:34

edit

ファイル