数か月前、なんらかの理由で、私はLinuxに仮想サーバーをレンタルし、ISPをインストールして自分でサービスを作成および管理することにしました。
ドキュメントとSSHコンソールで数時間考えた後、CentOSで最初のサーバーを起動しました。 1週間以内に、なぜgmail.ruとmail.ruがホスティングからの手紙を受け取りたくないのか、ディスク容量に制限を設定する方法、各共有ホスティングのPHP設定を制御する、そのBILL、アイテムを含む追加のパラメーターを購入する能力を持っている「RAM」は実際にはインストールできません。
そして、ここでのポイントは、BILL自体ではなく、ISP Liteにあります。ISPシステムからの技術サポートが私に答えたからです。
請求の「RAM」アドオンの設定は、ISPmanagerでユーザーに割り当てられたRAMに影響します。 ただし、RAMに制限がないISPmanager Liteを使用します。 RAMの制限は、ISPmanager Businessでのみ使用できます。
悲しみ。 Googleで1〜2時間立ち往生しても、価値のある無料のものは見つかりませんでした。 次に、「ペン」で「パラメータを変更」する機能のみがあります。
1.ユーザーフォルダーのphp.iniファイルを変更します。
2.クライアントがISPmanagerでPHPパラメーターを独立して変更できるようにするために、基本的に同じphp.iniファイルを変更し、クライアントの裁量でも変更します。
これらの方法は、ホスティングの購入とメンテナンスのすべての自動化を「殺し」ました。 一般的に「氷ではない」。 私は自分のサーバーを持っているので、プログラムに「入り」、イベントをインターセプトし、ファイル内の大切なアイテムmemory_limitを必要な値に書き換える機会があります。
アルファソリューション
まず、簡単な計画がありました。請求データベースで各ユーザーのインストール済みデータを見つけ、単純なPHPスクリプトを使用してphp.iniファイルでそれを書き換えます。 そして、CRONを介してPHP自体を実行します。 しかし、サイトに十分な128MBがない状況を思い出して、私は次のことを理解しました。これらのケースは偶然に発生し、ほぼ瞬時の解決策が必要でした。 CRONにこのスクリプトを5分ごとに実行させることは、99%の時間アイドル作業を行うタスクの文盲です。
ベータソリューション
私は、追加のホスティングサービスを変更するイベントにスクリプトを掛ける方法を探し始めました。 ISPsystemウェブサイトのドキュメントはまったく更新されていないため、苦痛は始まったばかりです。これは、管理者とモデレーター自身が自分のフォーラムで認めていることです。 グーグルで、PHPでイベントハンドラーを作成する方法を見つけました。 いずれにしても、私にとっては、作業時間の90%がこの特定の言語でのスクリプトの作成に費やされているためです。 BILLパネルでクライアントが追加のサービスを変更した直後にスクリプトが実行されるように目標が設定され、制限の値は現在の共有ホスティングのphp.iniファイルに書き込まれました。 すべての作業は、「tyka、試行錯誤の方法で」行われました。 その結果、BILLmanagerで追加の共有ホスティングサービスを更新する際に、INIファイルの値を変更するかなり適切な方法が見つかりました。 ドキュメントでは、このイベントは「vhost.edit」と呼ばれ、ホスティング設定が開かれ、「OK」ボタンをクリックした直後に発生します。
スクリプトはイベントで動作し、タスクに対処しましたが、私が理解していなかったのは、php-binフォルダーとそれに添付されたphp.iniファイルです。 つまり、最初はこれらのフォルダーはパス/ var / www / {user} / data / php-bin /に沿って配置され、完全に機能しましたが、ISPとサーバー全体の「いじめ」の後しばらくして、場所を/ var /に変更しましたwww / php-bin / {user} / ... Googleおよび前述のISPからのアップドキュメント以外によると、このためのDisableSecurePhpBinオプションがありますが、何の影響もありません。 その結果、両方の場所でphp.iniファイルの検索と、 / var / www / {userasket / data / php-bin / .php.ini (先頭にドットを含む)という名前のファイルの検索をプラグインに追加しました。
どうする
長い間書くつもりはありません。BILLmanager5のミニプラグインを使用するための既製の指示を与えるだけです。
1.ルート権限と次の内容で2つのファイルを作成する必要があります。
1.1。 /usr/local/mgr5/etc/xml/billmgr_mod_hiweb_vhostram.xml
<?xml version="1.0" encoding="UTF-8"?> <mgrdata> <handler name="hiweb_vhostram.php" type="cgi"> <event name="vhost.edit" after="yes"/> </handler> </mgrdata>
1.2。 /usr/local/mgr5/addon/hiweb_vhostram.php
#!/usr/bin/php <?php $logFile = '/var/www/log/hiweb_vhostram.log'; $logInfo = array(); //////// // $fileSettings = dirname( dirname( __FILE__ ) ) . '/etc/billmgr.conf.d/db.conf'; if( file_exists( $fileSettings ) ){ $fileSettingsContent = file( $fileSettings, FILE_IGNORE_NEW_LINES ); foreach( $fileSettingsContent as $line ){ $arr = explode( ' ', trim( $line ) ); if( count( $arr ) != 2 ) continue; list( $lineKey, $lineValue ) = $arr; if( $lineKey == 'DBHost' ) $DBHost = $lineValue; if( $lineKey == 'DBUser' ) $DBUser = $lineValue; if( $lineKey == 'DBPassword' ) $DBPassword = $lineValue; if( $lineKey == 'DBName' ) $DBName = $lineValue; } $mysql = new mysqli( $DBHost, $DBUser, $DBPassword, $DBName ); //$R = array($_GET, $_POST, $_SERVER); if( $mysql ){ // RAM $priceListResult = $mysql->query( 'SELECT id FROM pricelist WHERE itemtype=(SELECT id FROM itemtype WHERE name="RAM" AND statparam != "")' ); $priceList = reset( $priceListResult->fetch_assoc() ); /// if(!isset($_SERVER['PARAM_addon_'.$priceList])){ $logInfo[] = 'error: no parameter [PARAM_addon_'.$priceList.'] in $_SERVER'; }else{ $additionMemory = $_SERVER['PARAM_addon_'.$priceList]; /// $userLogin = $_SERVER['PARAM_username']; if( trim( $userLogin ) == '' ){ //do nothing } else{ $logInfo[] = 'select user ['.$userLogin.']'; /// //$userResult = $mysql->query( 'SELECT * FROM itemparam WHERE intname="username" AND item="' . $userId . '"' ); //$userData = $userResult->fetch_assoc(); //$userLogin = $userData['value']; /// /// $phpIniFiles = array( '/var/www/php-bin/' . $userLogin . '/php.ini', '/var/www/' . $userLogin . '/data/php-bin/.php.ini', '/var/www/' . $userLogin . '/data/php-bin/php.ini' ); // foreach( $phpIniFiles as $phpIni ){ $B = ''; if( !file_exists( $phpIni ) ){ $logInfo[] = 'error: file not exists!'; }elseif( !is_readable( $phpIni ) ){ $logInfo[] = 'error: file not readable!'; }elseif( !is_file( $phpIni ) ){ $logInfo[] = 'error: this is dir, not file!!!'; }else{ $content = file_get_contents( $phpIni ); preg_match('/^memory_limit = (\d){1,4}[a-zA-Z]?$/im',$content, $match); if(count($match) > 0){ $line = trim(reset($match)); // $lineExplode = explode( ' = ', $line ); $lineExplode[1] = $additionMemory . 'M'; $newLine = implode( ' = ', $lineExplode ); // if( trim( $line ) != trim( $newLine ) ){ $logInfo[] = file_put_contents($phpIni, str_replace($line,$newLine,$content)) ? $line.' → '.$newLine : 'error: file_put_content'; }else{ $logInfo[] = 'not change: '.$line.' → '.$newLine; } }else{ $add = 'memory_limit = ' . $additionMemory.'M'; $content .= chr( 13 ) . chr( 10 ) . $add . chr( 13 ) . chr( 10 ); $logInfo[] = file_put_contents($phpIni, $content) ? '+ '.$add : 'error add: file_put_content'; } } } } } } else { $logInfo[] = 'error: mysql not connected!'; } } file_put_contents($logFile, print_r( $logInfo, 1 ) ); echo '<?xml version="1.0" encoding="UTF-8"?><doc>'; echo '</doc>'; ?>
2.必要な関税に追加のオプション「RAM」を追加します。ISP、BILLマネージャーをインストールするとすぐに利用できました。 関税に含めるだけで、データのペアを示します。
3. WWWドメイン→PHPを「CGI」操作モードに変換する必要もあります。
4. BILLmanagerで仮想ホスティング用のRAMを「購入」して、「OK」をクリックします。
5.念のため、共有ホスティングのRAM制限を変更する作業をチェックするためのPHPファイル。 目的のホストのルートで、index.phpファイルの隣に作成し、それを呼び出してdomain.ru / file.phpを確認します。
<?php function return_bytes( $val ){ $val = trim( $val ); $last = strtolower( $val[ strlen( $val ) - 1 ] ); switch( $last ){ // The 'G' modifier is available since PHP 5.1.0 case 'g': $val *= 1024; case 'm': $val *= 1024; case 'k': $val *= 1024; } return $val; } /** * * @param $size - INT * @return string */ function size_format( $size ){ $size = intval( $size ); if( $size < 1024 ){ return $size . " bytes"; }else if( $size < ( 1024 * 1024 ) ){ $size = round( $size / 1024, 1 ); return $size . " KB"; }else if( $size < ( 1024 * 1024 * 1024 ) ){ $size = round( $size / ( 1024 * 1024 ), 1 ); return $size . " MB"; }else{ $size = round( $size / ( 1024 * 1024 * 1024 ), 1 ); return $size . " GB"; } } $memory = size_format( return_bytes( ini_get( 'memory_limit' ) ) ); echo '<phpmem>'; echo '<val>' . $memory . '</val>'; echo '</phpmem>';
おわりに
最新のドキュメントは時間を大幅に節約します! ))このプラグインは、このようなアドオンを書いた最初の経験であり、Linuxとサーバーソフトウェアの複雑さしか理解していないため、正しく動作する、または動作することさえありません。 理にかなっている場合は、時間をかけて修正していくと思います。