パフォーマンス FAQ
パフォーマンス よくある質問
Section titled “パフォーマンス よくある質問”XOOPS パフォーマンス最適化とスローサイトの診断についてのよくある質問と回答。
一般的なパフォーマンス
Section titled “一般的なパフォーマンス”Q: XOOPS サイトが遅いかどうかを判断するには?
Section titled “Q: XOOPS サイトが遅いかどうかを判断するには?”A: これらのツールとメトリクスを使用:
- ページロード時間:
# curl を使用して応答時間を計測curl -w "@curl-format.txt" -o /dev/null -s https://yoursite.com
# またはオンラインツール# - PageSpeed Insights(Google)# - GTmetrix# - WebPageTest- ターゲットメトリクス:
- First Contentful Paint(FCP): < 1.8秒
- Largest Contentful Paint(LCP): < 2.5秒
- Time to First Byte(TTFB): < 0.6秒
- ページ合計サイズ: < 2-3 MB
- サーバーログを確認:
# Apachetail -100 /var/log/apache2/access.log
# Nginxtail -100 /var/log/nginx/access.log
# スロー リクエストを探す(> 1 秒)Q: 最も一般的なパフォーマンスの問題は何ですか?
Section titled “Q: 最も一般的なパフォーマンスの問題は何ですか?”A:
pie title パフォーマンスの問題 一般的な原因 "最適化されていないデータベースクエリ" : 25 "大きな圧縮されていないアセット" : 20 "キャッシングが不足" : 20 "拡張機能/プラグインが多すぎる" : 15 "サーバーリソース不足" : 12 "最適化されていない画像" : 8Q: 最適化をどこに集中させるべきですか?
Section titled “Q: 最適化をどこに集中させるべきですか?”A: 最適化の優先順位に従う:
graph TD A[パフォーマンス最適化] --> B["1. キャッシング"] A --> C["2. データベースクエリ"] A --> D["3. アセット最適化"] A --> E["4. コード最適化"]
B --> B1["✓ ページキャッシング"] B --> B2["✓ オブジェクト キャッシング"] B --> B3["✓ クエリ キャッシング"]
C --> C1["✓ インデックスを追加"] C --> C2["✓ クエリを最適化"] C --> C3["✓ N+1 を削除"]
D --> D1["✓ 画像を圧縮"] D --> D2["✓ CSS/JS をミニファイ"] D --> D3["✓ gzip を有効化"]
E --> E1["✓ 不要なコードを削除"] E --> E2["✓ 遅延読み込み"] E --> E3["✓ コード リファクタリング"]キャッシング
Section titled “キャッシング”Q: XOOPS でキャッシングを有効化するには?
Section titled “Q: XOOPS でキャッシングを有効化するには?”A: XOOPS にはビルトインキャッシングがあります。管理者 > 設定 > パフォーマンス で設定:
<?php// mainfile.php または管理画面でキャッシュ設定を確認// 一般的なキャッシュタイプ:// 1. file - ファイルベースのキャッシュ(デフォルト)// 2. memcache - Memcached(インストール済みの場合)// 3. redis - Redis(インストール済みの場合)
// コード内でキャッシュを使用:$cache = xoops_cache_handler::getInstance();
// キャッシュから読み込み$data = $cache->read('cache_key');
if ($data === false) { // キャッシュにない場合、ソースから取得 $data = expensive_operation();
// キャッシュに書き込み(3600 = 1 時間) $cache->write('cache_key', $data, 3600);}?>Q: どのタイプのキャッシングを使用すべきですか?
Section titled “Q: どのタイプのキャッシングを使用すべきですか?”A:
- ファイル キャッシュ: デフォルト、シンプル、セットアップ不要。小規模サイトに最適。
- Memcache: より高速、メモリベース。トラフィック多いサイトに最適。
- Redis: 最も強力、より多くのデータタイプをサポート。スケーリングに最適。
インストールと有効化:
# Memcached をインストールsudo apt-get install memcached php-memcached
# または Redis をインストールsudo apt-get install redis-server php-redis
# PHP-FPM または Apache を再起動sudo systemctl restart php-fpmsudo systemctl restart apache2その後、XOOPS 管理で有効化します。
Q: XOOPS キャッシュをクリアするには?
Section titled “Q: XOOPS キャッシュをクリアするには?”A:
# すべてのキャッシュをクリアrm -rf xoops_data/caches/*
# Smarty キャッシュを具体的にクリアrm -rf xoops_data/caches/smarty_cache/*rm -rf xoops_data/caches/smarty_compile/*
# または管理パネル管理者 > システム > メンテナンス > キャッシュをクリア に移動コード内:
<?php$cache = xoops_cache_handler::getInstance();$cache->deleteAll();
// または特定のキーをクリア$cache->delete('cache_key');?>Q: データをどのくらいの期間キャッシュすべきですか?
Section titled “Q: データをどのくらいの期間キャッシュすべきですか?”A: データの鮮度要件に応じて:
<?php// 5 分 - 頻繁に変更するデータ$cache->write('key', $data, 300);
// 1 時間 - 半静的データ$cache->write('key', $data, 3600);
// 24 時間 - 静的データ、画像など$cache->write('key', $data, 86400);
// 有効期限なし(手動クリアまで)$cache->write('key', $data, 0);
// 現在のリクエスト中のみキャッシュ$cache->write('key', $data, 1);?>データベース最適化
Section titled “データベース最適化”Q: スロー データベースクエリを見つけるには?
Section titled “Q: スロー データベースクエリを見つけるには?”A: クエリログを有効化:
<?php// mainfile.php 内define('XOOPS_DB_DEBUGMODE', true);define('XOOPS_SQL_DEBUG', true);
// その後 xoops_log テーブルを確認SELECT * FROM xoops_log WHERE logid > SOME_NUMBERORDER BY created DESC LIMIT 20;?>または MySQL スロークエリログを使用:
# /etc/mysql/my.cnf で有効化[mysqld]slow_query_log = 1slow_query_log_file = /var/log/mysql/slow.loglong_query_time = 1 # 1 秒を超えるクエリをログ
# スロークエリを表示tail -100 /var/log/mysql/slow.logQ: データベースクエリを最適化するには?
Section titled “Q: データベースクエリを最適化するには?”A: これらの手順に従う:
1. データベース インデックスを追加
-- よく検索される列にインデックスを追加ALTER TABLE `xoops_articles` ADD INDEX `author_id` (`author_id`);ALTER TABLE `xoops_articles` ADD INDEX `created` (`created`);
-- インデックスが役立つか確認ANALYZE TABLE `xoops_articles`;EXPLAIN SELECT * FROM xoops_articles WHERE author_id = 5;2. LIMIT とページネーションを使用
<?php// 誤り - すべてのレコードを取得$result = $db->query("SELECT * FROM xoops_articles");
// 正しい - オフセットから 10 レコードを取得$limit = 10;$offset = 0; // ページネーションで変更$result = $db->query( "SELECT * FROM xoops_articles LIMIT $limit OFFSET $offset");?>3. 必要な列のみを選択
<?php// 誤り$result = $db->query("SELECT * FROM xoops_articles");
// 正しい$result = $db->query( "SELECT id, title, author_id, created FROM xoops_articles");?>4. N+1 クエリを避ける
<?php// 誤り - N+1 問題$articles = $db->query("SELECT * FROM xoops_articles");while ($article = $articles->fetch_assoc()) { // このクエリは記事ごと 1 回実行! $author = $db->query( "SELECT * FROM xoops_users WHERE uid = " . $article['author_id'] );}
// 正しい - JOIN を使用$result = $db->query(" SELECT a.*, u.uname, u.email FROM xoops_articles a JOIN xoops_users u ON a.author_id = u.uid");
while ($row = $result->fetch_assoc()) { echo $row['title'] . " by " . $row['uname'];}?>5. EXPLAIN を使用してクエリを分析
EXPLAIN SELECT * FROM xoops_articles WHERE author_id = 5 AND status = 1;
-- 確認項目:-- - type: ALL(悪い)、INDEX(OK)、const/ref(良い)-- - possible_keys: 利用可能なインデックスを表示-- - key: 最適なインデックスを使用-- - rows: 低い数値になるべきQ: データベースロードを減らすには?
Section titled “Q: データベースロードを減らすには?”A:
- クエリ結果をキャッシュ:
<?php$cache = xoops_cache_handler::getInstance();$articles = $cache->read('all_articles');
if ($articles === false) { $result = $db->query("SELECT * FROM xoops_articles"); $articles = $result->fetch_all(); $cache->write('all_articles', $articles, 3600);}?>- 古いデータを別テーブルに保存
- ログを定期的にクリーンアップ:
# 30 日より古いログエントリを削除DELETE FROM xoops_log WHERE created < NOW() - INTERVAL 30 DAY;- クエリキャッシュを有効化(MySQL):
SET GLOBAL query_cache_type = 1;SET GLOBAL query_cache_size = 268435456; -- 256 MBアセット最適化
Section titled “アセット最適化”Q: CSS と JavaScript を最適化するには?
Section titled “Q: CSS と JavaScript を最適化するには?”A:
1. ファイルをミニファイ:
# オンラインツール# - cssminifier.com# - javascript-minifier.com# - minify.org
# またはコマンドラインツールsudo apt-get install yui-compressor closure-compileryui-compressor file.css -o file.min.css2. 関連ファイルを結合:
{* 多くのファイルの代わり *}<link rel="stylesheet" href="{$xoops_url}/themes/{$xoops_theme}/style1.css"><link rel="stylesheet" href="{$xoops_url}/themes/{$xoops_theme}/style2.css"><link rel="stylesheet" href="{$xoops_url}/themes/{$xoops_theme}/style3.css">
{* 1 つに結合 *}<link rel="stylesheet" href="{$xoops_url}/themes/{$xoops_theme}/style.css">3. 重要でない JavaScript を遅延読み込み:
{* 重要な JS - すぐに読み込み *}<script src="critical.js"></script>
{* 重要でない JS - ページ後に読み込み *}<script src="analytics.js" defer></script><script src="ads.js" async></script>4. Gzip 圧縮を有効化(.htaccess):
<IfModule mod_deflate.c> AddOutputFilterByType DEFLATE text/html AddOutputFilterByType DEFLATE text/plain AddOutputFilterByType DEFLATE text/xml AddOutputFilterByType DEFLATE text/css AddOutputFilterByType DEFLATE text/javascript AddOutputFilterByType DEFLATE application/javascript AddOutputFilterByType DEFLATE application/xml</IfModule>Q: 画像を最適化するには?
Section titled “Q: 画像を最適化するには?”A:
1. 正しい形式を選択:
- JPG: 写真と複雑な画像
- PNG: グラフィックと透過度のある画像
- WebP: モダンブラウザ、より良い圧縮
- AVIF: 最新、最適な圧縮
2. 画像を圧縮:
# ImageMagick を使用convert image.jpg -quality 85 image-compressed.jpg
# ImageOptim を使用imageoptim image.jpg
# オンラインツール# - imagecompressor.com# - tinypng.com3. レスポンシブ画像を提供:
{* 異なるサイズを提供 *}<picture> <source srcset="image-large.webp" type="image/webp" media="(min-width: 1200px)"> <source srcset="image-medium.webp" type="image/webp" media="(min-width: 768px)"> <source srcset="image-small.webp" type="image/webp"> <img src="image.jpg" alt="説明"></picture>4. 画像を遅延読み込み:
{* ネイティブ遅延読み込み *}<img src="image.jpg" loading="lazy" alt="説明">
{* または JavaScript ライブラリで *}<script src="https://cdn.jsdelivr.net/npm/lazysizes@5/lazysizes.min.js"></script><img src="placeholder.jpg" data-src="image.jpg" class="lazyload" alt="説明">サーバー設定
Section titled “サーバー設定”Q: サーバーパフォーマンスを確認するには?
Section titled “Q: サーバーパフォーマンスを確認するには?”A:
# CPU とメモリtop -b -n 1 | head -20free -hdf -h
# PHP-FPM プロセスを確認ps aux | grep php-fpm
# Apache/Nginx 接続を確認netstat -an | grep ESTABLISHED | wc -l
# リアルタイムで監視watch 'free -h && echo "---" && df -h'Q: XOOPS 用に PHP を最適化するには?
Section titled “Q: XOOPS 用に PHP を最適化するには?”A: /etc/php/8.x/fpm/php.ini を編集:
; XOOPS 用に制限を増やすmax_execution_time = 300 ; デフォルト 30 秒memory_limit = 512M ; デフォルト 128MBupload_max_filesize = 100M ; デフォルト 2MBpost_max_size = 100M ; デフォルト 8MB
; パフォーマンス用に opcache を有効化opcache.enable = 1opcache.memory_consumption = 256opcache.max_accelerated_files = 20000opcache.validate_timestamps = 0 ; 本番環境: 0(再起動時に再読み込み)opcache.revalidate_freq = 0 ; 本番環境: 0 または高い数字
; データベースdefault_socket_timeout = 60mysqli.default_socket = /run/mysqld/mysqld.sockその後 PHP を再起動:
sudo systemctl restart php8.2-fpm# またはsudo systemctl restart apache2Q: HTTP/2 と圧縮を有効化するには?
Section titled “Q: HTTP/2 と圧縮を有効化するには?”A: Apache(.htaccess):
# HTTPS を有効化(HTTP/2 に必要)<IfModule mod_ssl.c> Protocols h2 http/1.1</IfModule>
# 圧縮を有効化<IfModule mod_deflate.c> AddOutputFilterByType DEFLATE text/html text/plain text/css text/javascript application/javascript</IfModule>
# ブラウザキャッシングを有効化<IfModule mod_expires.c> ExpiresActive On ExpiresByType image/jpeg "access plus 1 year" ExpiresByType image/png "access plus 1 year" ExpiresByType text/css "access plus 1 month" ExpiresByType text/javascript "access plus 1 month"</IfModule>Nginx(nginx.conf):
http { # gzip を有効化 gzip on; gzip_types text/plain text/css text/javascript application/json; gzip_min_length 1000;
# HTTP/2 を有効化 listen 443 ssl http2;
# ブラウザキャッシング expires 1y; add_header Cache-Control "public, immutable";}Q: 時間経過に伴い XOOPS パフォーマンスを監視するには?
Section titled “Q: 時間経過に伴い XOOPS パフォーマンスを監視するには?”A:
1. Google Analytics を使用:
- Core Web Vitals
- ページロード時間
- ユーザー動作
2. サーバー監視ツールを使用:
# Glances(システム監視)をインストールsudo apt-get install glancesglances
# または New Relic、DataDog など3. リクエストをログして分析:
# 平均応答時間を取得grep "GET /index.php" /var/log/apache2/access.log | \ awk '{print $NF}' | \ sort -n | \ awk '{sum+=$1; count++} END {print "平均: " sum/count " ms"}'Q: メモリリークを特定するには?
Section titled “Q: メモリリークを特定するには?”A:
<?php// コード内でメモリ使用量を追跡$start_memory = memory_get_usage();
// 操作を実行for ($i = 0; $i < 1000; $i++) { $array[] = expensive_operation();}
$end_memory = memory_get_usage();$used = ($end_memory - $start_memory) / 1024 / 1024;
if ($used > 50) { // > 50MB の場合にアラート error_log("メモリリークが検出された: " . $used . " MB");}
// ピークメモリを確認$peak = memory_get_peak_usage();echo "ピークメモリ: " . ($peak / 1024 / 1024) . " MB";?>パフォーマンス チェックリスト
Section titled “パフォーマンス チェックリスト”graph TD A[パフォーマンス最適化チェックリスト] --> B["インフラストラクチャ"] A --> C["キャッシング"] A --> D["データベース"] A --> E["アセット"]
B --> B1["✓ PHP 8.x がインストール"] B --> B2["✓ Opcache が有効"] B --> B3["✓ 十分な RAM"] B --> B4["✓ SSD ストレージ"]
C --> C1["✓ ページキャッシングが有効"] C --> C2["✓ オブジェクトキャッシングが有効"] C --> C3["✓ ブラウザキャッシングを設定"] C --> C4["✓ CDN を設定"]
D --> D1["✓ インデックスを追加"] D --> D2["✓ スロークエリを修正"] D --> D3["✓ 古いデータを保存"] D --> D4["✓ クエリログをクリーンアップ"]
E --> E1["✓ CSS をミニファイ"] E --> E2["✓ JS をミニファイ"] E --> E3["✓ 画像を最適化"] E --> E4["✓ gzip を有効化"]関連ドキュメント
Section titled “関連ドキュメント”- データベースデバッグ
- デバッグモードを有効化
- モジュール FAQ
- パフォーマンス最適化
#xoops #performance #optimization #faq #troubleshooting #caching