×
¥
查看详情
🔥 会员专享 文生文 代码生成

PHP文件操作代码生成器

👁️ 68 次查看
📅 Dec 10, 2025
💡 核心价值: 本提示词专为PHP开发场景设计,能够根据用户指定的文件操作类型和文件名,生成专业、准确且安全的PHP文件操作代码。通过角色扮演和结构化工作流程,确保代码符合最佳实践,包含必要的错误处理和安全性考量,适用于文件读取、写入、追加等多种操作场景,帮助开发者快速实现文件管理功能。

🎯 可自定义参数(2个)

文件操作类型
需要执行的文件操作类型
文件名
需要操作的目标文件名

🎨 效果示例

安全读取 JSON 配置文件(read:config/settings.json)

<?php
declare(strict_types=1);

/**
 * 安全读取 config/settings.json(PHP 7.4+)
 * - 路径校验与白名单扩展名
 * - 文件存在性与可读性检查
 * - 共享锁(LOCK_SH)避免并发写入造成的脏读
 * - 文件大小限制防止内存滥用
 * - 严格 JSON 解析(JSON_THROW_ON_ERROR)
 *
 * 使用方式:
 *   1) 作为独立脚本运行:php read_config.php
 *   2) 作为库引入:require 'read_config.php'; $config = loadConfig();
 */

const BASE_DIR = __DIR__;                     // 项目根目录(根据需要调整)
const TARGET_RELATIVE_PATH = 'config/settings.json';
const MAX_FILE_BYTES = 1048576;               // 最大读取 1 MiB,可按需调整
const LOCK_TIMEOUT_MS = 2000;                 // 获取共享锁最大等待时间 2s

/**
 * 入口函数:加载并解析配置
 * @param string $relativePath 相对 BASE_DIR 的配置路径
 * @return array 解析后的配置数组
 * @throws RuntimeException|JsonException
 */
function loadConfig(string $relativePath = TARGET_RELATIVE_PATH): array
{
    $absolutePath = resolveAndValidatePath(BASE_DIR, $relativePath, ['json']);
    $json = readFileWithSharedLock($absolutePath, MAX_FILE_BYTES, LOCK_TIMEOUT_MS);

    // 严格解析 JSON,出现语法错误将抛出 JsonException
    $data = json_decode($json, true, 512, JSON_THROW_ON_ERROR);

    if (!is_array($data)) {
        throw new RuntimeException('配置文件内容必须为 JSON 对象(解析结果应为关联数组)');
    }

    return $data;
}

/**
 * 安全解析与校验路径,限制在 baseDir 之下并校验扩展名
 */
function resolveAndValidatePath(string $baseDir, string $relativePath, array $allowedExtensions): string
{
    $baseReal = realpath($baseDir);
    if ($baseReal === false || !is_dir($baseReal)) {
        throw new RuntimeException('基础目录无效或不可用');
    }

    // 基础的路径注入防护:禁止绝对路径、禁止上级目录跳转、禁止空字节
    if ($relativePath === '' ||
        $relativePath[0] === DIRECTORY_SEPARATOR ||
        strpos($relativePath, "\0") !== false ||
        strpos($relativePath, '..') !== false
    ) {
        throw new RuntimeException('相对路径不合法');
    }

    // 校验扩展名
    $ext = strtolower((string)pathinfo($relativePath, PATHINFO_EXTENSION));
    if ($ext === '' || !in_array($ext, $allowedExtensions, true)) {
        throw new RuntimeException('不被允许的文件类型');
    }

    // 拼接并解析真实路径
    $candidate = $baseReal . DIRECTORY_SEPARATOR . ltrim($relativePath, DIRECTORY_SEPARATOR);
    if (!is_file($candidate)) {
        throw new RuntimeException('目标文件不存在:' . $relativePath);
    }

    $real = realpath($candidate);
    if ($real === false) {
        throw new RuntimeException('无法解析文件真实路径');
    }

    // 保证文件位于 baseDir 内部
    $prefix = rtrim($baseReal, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;
    if (strpos($real, $prefix) !== 0) {
        throw new RuntimeException('访问越界:目标文件不在允许的基础目录内');
    }

    if (!is_readable($real)) {
        throw new RuntimeException('目标文件不可读(请检查权限)');
    }

    return $real;
}

/**
 * 以共享锁安全读取文件
 */
function readFileWithSharedLock(string $absolutePath, int $maxBytes, int $lockTimeoutMs): string
{
    $fh = @fopen($absolutePath, 'rb');
    if ($fh === false) {
        throw new RuntimeException('无法打开文件进行读取');
    }

    try {
        // 获取共享锁,等待直至超时
        $start = microtime(true);
        $locked = false;
        do {
            $locked = flock($fh, LOCK_SH | LOCK_NB);
            if ($locked) {
                break;
            }
            usleep(10_000); // 10ms
        } while (((microtime(true) - $start) * 1000) < $lockTimeoutMs);

        if (!$locked) {
            throw new RuntimeException('获取文件共享锁超时');
        }

        // 尺寸检查(如无法获取也继续读)
        $size = @filesize($absolutePath);
        if (is_int($size) && $size > $maxBytes) {
            throw new RuntimeException('文件过大,已超出安全读取限制(' . $maxBytes . ' 字节)');
        }

        // 读取内容
        $content = stream_get_contents($fh);
        if ($content === false) {
            throw new RuntimeException('读取文件内容失败');
        }

        return $content;
    } finally {
        // 释放锁并关闭
        if (is_resource($fh)) {
            @flock($fh, LOCK_UN);
            @fclose($fh);
        }
    }
}

/* ----------------------- 示例执行逻辑(可根据需要保留/移除) ----------------------- */

if (PHP_SAPI === 'cli') {
    // CLI 演示:仅输出加载结果,不回显具体配置以避免敏感信息泄露
    try {
        $config = loadConfig();
        echo "配置加载成功。键数量:" . count($config) . PHP_EOL;
        exit(0);
    } catch (Throwable $e) {
        fwrite(STDERR, '加载配置失败:' . $e->getMessage() . PHP_EOL);
        exit(1);
    }
} else {
    // Web 环境演示:返回通用状态,不暴露配置详情
    header('Content-Type: application/json; charset=utf-8');
    try {
        $config = loadConfig();
        echo json_encode(['success' => true, 'message' => '配置加载成功'], JSON_UNESCAPED_UNICODE);
    } catch (Throwable $e) {
        http_response_code(500);
        echo json_encode(['success' => false, 'error' => 'CONFIG_READ_ERROR'], JSON_UNESCAPED_UNICODE);
    }
}

使用说明

  • 文件组织建议
    • 将本脚本放置在项目根目录(BASE_DIR = DIR),并确保配置文件位于 config/settings.json。
    • 如脚本不在项目根目录,请调整常量 BASE_DIR,或传入自定义相对路径:loadConfig('config/settings.json')。
  • 运行方式
    • CLI:php read_config.php
    • Web:通过浏览器访问或由你的业务代码 require/include 本文件后调用 loadConfig()。
  • 配置文件格式
    • settings.json 必须是合法 JSON,并且顶层为对象。例如: { "app_name": "MyApp", "debug": false, "db": { "host": "localhost", "port": 3306 } }

安全提示

  • 避免直接将配置内容输出到页面或日志,尤其是包含凭证字段(如数据库密码、API Key)。
  • 严格限制可访问的目录与扩展名(本代码已限制为 .json 且必须位于 BASE_DIR 内)。
  • 在生产环境中为配置文件设置合适权限(建议 640 或更严格),确保 Web 服务用户具备只读权限。
  • 若需要以用户输入决定配置文件路径,必须进行严格白名单校验与固定基准目录限制,禁止相对路径穿越(本代码已防护)。
  • 对文件读取设置合理的大小限制,防止异常大文件导致内存开销过大。

错误处理

  • 目标文件不存在:检查 config/settings.json 是否存在,路径是否正确,文件名大小写是否匹配。
  • 权限不足(不可读):为 Web 服务用户或执行用户授予读取权限(chmod/chown),避免 777。
  • 获取共享锁超时:可能被长期写锁占用,排查并发写入逻辑或延长 LOCK_TIMEOUT_MS。
  • 文件过大:调整 MAX_FILE_BYTES 或排查文件是否被误写入大数据。
  • JSON 解析错误(JsonException):修复 JSON 语法问题(逗号、引号、编码、BOM 等);可使用 JSON 校验工具辅助检查。
  • 路径越界/类型不允许:确保传入路径位于 BASE_DIR 内且扩展名为 .json。

PHP安全写入文件(覆盖写入 storage/logs/app.log)

<?php
declare(strict_types=1);

/**
 * 安全写入(覆盖写入)示例:将内容写入 storage/logs/app.log
 * - 原子写入:先写入临时文件,再原子替换目标文件,避免部分写入
 * - 权限控制:目录与文件权限设置(0750/0640)
 * - 安全检查:固定路径、目录非符号链接、大小限制、内容清洗
 * - 兼容:PHP 7.4+
 */

const RELATIVE_TARGET = 'storage/logs/app.log'; // 固定相对路径(不接收用户输入)
const MAX_BYTES       = 1024 * 1024;            // 单次写入最大1MB
const DIR_PERM        = 0750;
const FILE_PERM       = 0640;

/**
 * 确保目录存在且可写,拒绝使用符号链接目录
 */
function ensureDirectory(string $dir, int $perm = DIR_PERM): void
{
    if (is_dir($dir)) {
        if (is_link($dir)) {
            throw new RuntimeException("Refusing to use symlinked directory: $dir");
        }
        if (!is_writable($dir)) {
            throw new RuntimeException("Directory is not writable: $dir");
        }
        return;
    }
    if (!mkdir($dir, $perm, true)) {
        throw new RuntimeException("Failed to create directory: $dir");
    }
    @chmod($dir, $perm); // 受 umask 影响,尽力设置
}

/**
 * 日志内容清洗:
 * - 尝试转为 UTF-8
 * - 统一换行符为 \n
 * - 去除不可打印控制字符(保留 \t 和 \n)
 * - 限制最大字节数
 */
function sanitizeLogContent(string $input): string
{
    if (function_exists('mb_detect_encoding') && function_exists('mb_convert_encoding')) {
        if (!mb_detect_encoding($input, 'UTF-8', true)) {
            // 当来源编码未知时,'auto' 会尝试检测常见编码并转为 UTF-8
            $input = mb_convert_encoding($input, 'UTF-8', 'auto');
        }
    }

    // 统一换行
    $input = str_replace(["\r\n", "\r"], "\n", $input);

    // 去除不可打印控制字符(保留 \t 与 \n)
    $filtered = @preg_replace('/[^\P{C}\t\n]/u', '', $input);
    if ($filtered !== null) {
        $input = $filtered;
    }

    if (strlen($input) > MAX_BYTES) {
        throw new RuntimeException('Log content exceeds size limit of ' . MAX_BYTES . ' bytes.');
    }

    return $input;
}

/**
 * 原子覆盖写入:
 * - 在同目录下创建临时文件,写入完成后 rename 覆盖目标文件
 * - 在部分平台上,如目标存在 rename 可能失败,则先尝试 unlink 再重试
 */
function safeOverwrite(string $targetPath, string $data, int $perm = FILE_PERM): void
{
    $dir = dirname($targetPath);

    ensureDirectory($dir);

    $tmp = tempnam($dir, 'wrt_');
    if ($tmp === false) {
        throw new RuntimeException('Failed to create temporary file.');
    }

    $bytes = file_put_contents($tmp, $data, LOCK_EX);
    if ($bytes === false || $bytes !== strlen($data)) {
        @unlink($tmp);
        throw new RuntimeException('Failed to write all data to temporary file.');
    }

    // 原子替换(同一文件系统内)
    if (!@rename($tmp, $targetPath)) {
        // 某些平台(尤其是旧版 Windows)如目标存在可能失败
        if (file_exists($targetPath) && !@unlink($targetPath)) {
            @unlink($tmp);
            throw new RuntimeException('Failed to replace existing target file.');
        }
        if (!@rename($tmp, $targetPath)) {
            @unlink($tmp);
            throw new RuntimeException('Failed to move temporary file into place.');
        }
    }

    // 设置最终文件权限(尽力而为)
    @chmod($targetPath, $perm);
}

/**
 * 计算目标文件的绝对路径(固定常量,不接受外部输入)
 */
function getTargetAbsolutePath(): string
{
    $baseDir = realpath(__DIR__);
    if ($baseDir === false) {
        throw new RuntimeException('Failed to resolve script base directory.');
    }

    return $baseDir . DIRECTORY_SEPARATOR . str_replace(['/', '\\'], DIRECTORY_SEPARATOR, RELATIVE_TARGET);
}

/**
 * 示例写入(覆盖写入)
 * 注意:覆盖写入会清空已有内容,仅保留本次写入内容
 */
try {
    // 示例日志内容(应由服务器端生成;若包含用户输入请先清洗/转义)
    $logLine = sprintf(
        "[%s] level=INFO message=%s\n",
        date('c'),
        'Application started'
    );

    $payload = sanitizeLogContent($logLine);
    $target  = getTargetAbsolutePath();

    // 执行覆盖写入
    safeOverwrite($target, $payload);

    // 按需处理返回(CLI/HTTP)
    echo "Wrote log to: " . $target . PHP_EOL;
} catch (Throwable $e) {
    // 记录详细错误到 PHP 错误日志(不向客户端暴露具体路径/细节)
    error_log('Log write error: ' . $e->getMessage());

    // 客户端返回最小错误信息
    if (PHP_SAPI !== 'cli') {
        http_response_code(500);
    }
    echo "Failed to write log.";
}

使用说明

  • 文件路径:相对于当前脚本目录,写入至 storage/logs/app.log。如果目录不存在,脚本会以 0750 权限创建。
  • 覆盖写入:本示例为“write(覆盖)”操作,每次执行会用新的内容替换原文件全部内容。若您需要“追加写入”,请见下方备注。
  • 快速开始:
    1. 将上述代码保存为任意 PHP 脚本(例如 scripts/write_log.php)。
    2. 确保 PHP 进程对项目目录拥有写权限(特别是 storage/logs)。
    3. 通过 CLI 或 Web 执行该脚本,成功后会在 storage/logs/app.log 中看到新内容。
  • 自定义内容:将 $logLine 替换为您的业务日志字符串;若包含用户输入,请先清洗和长度限制。

附:如果您更适合“追加写入”日志(常规日志场景),可将 safeOverwrite 替换为使用 FILE_APPEND 的实现(请谨慎使用,这里仅提供参考,不在本次“write/覆盖”范围内):

  • 参考做法:file_put_contents($target, $payload, FILE_APPEND | LOCK_EX)

安全提示

  • 禁止使用外部(用户)输入来构造文件路径;本示例使用固定常量,避免路径穿越。
  • 若需要写入用户提供的文本,务必:
    • 使用 sanitizeLogContent 进行清洗(编码统一、去除控制字符、长度限制)。
    • 额外根据业务进行关键词或格式校验,防止日志注入(如伪造多行、插入控制序列)。
  • 权限与所有者:
    • 目录使用 0750,文件使用 0640,避免对“其他用户”开放读写。
    • 确保运行 PHP 的用户对 storage/logs 拥有写权限。
  • 符号链接安全:拒绝使用符号链接目录,避免被重定向到敏感路径。
  • 原子写入:通过临时文件 + rename 避免并发写入产生的半成品文件;确保临时文件与目标文件在同一挂载点。

错误处理

可能的错误与解决建议:

  • Failed to create directory / Directory is not writable
    • 检查目录是否存在、是否为符号链接、PHP 进程是否有写权限;修正所有者与权限(chmod/chown)。
  • Failed to create temporary file
    • 目录不可写或磁盘空间不足;检查磁盘配额与权限。
  • Failed to write all data to temporary file
    • 磁盘不足或文件系统限制;检查磁盘空间与 ulimit。
  • Failed to replace existing target file / Failed to move temporary file into place
    • 可能目标在不同文件系统、Windows 上覆盖失败或被占用;确保目标目录与临时文件同一分区,或释放占用进程。
  • Log content exceeds size limit
    • 单次写入内容超过 MAX_BYTES,缩小内容或调大限制(注意内存与磁盘压力)。
  • 编码或正则相关问题
    • 若未安装 mbstring 扩展,代码会降级跳过编码转换;如需严格编码控制,请启用 mbstring。

示例详情

📖 如何使用

30秒出活:复制 → 粘贴 → 搞定
与其花几十分钟和AI聊天、试错,不如直接复制这些经过千人验证的模板,修改几个 {{变量}} 就能立刻获得专业级输出。省下来的时间,足够你轻松享受两杯咖啡!
加载中...
💬 不会填参数?让 AI 反过来问你
不确定变量该填什么?一键转为对话模式,AI 会像资深顾问一样逐步引导你,问几个问题就能自动生成完美匹配你需求的定制结果。零门槛,开口就行。
转为对话模式
🚀 告别复制粘贴,Chat 里直接调用
无需切换,输入 / 唤醒 8000+ 专家级提示词。 插件将全站提示词库深度集成于 Chat 输入框。基于当前对话语境,系统智能推荐最契合的 Prompt 并自动完成参数化,让海量资源触手可及,从此彻底告别"手动搬运"。
即将推出
🔌 接口一调,提示词自己会进化
手动跑一次还行,跑一百次呢?通过 API 接口动态注入变量,接入批量评价引擎,让程序自动迭代出更高质量的提示词方案。Prompt 会自己进化,你只管收结果。
发布 API
🤖 一键变成你的专属 Agent 应用
不想每次都配参数?把这条提示词直接发布成独立 Agent,内嵌图片生成、参数优化等工具,分享链接就能用。给团队或客户一个"开箱即用"的完整方案。
创建 Agent

✅ 特性总结

一键生成可直接运行的PHP文件读写追加代码,含注释与用法说明,落地即可用
自动补齐文件存在性与权限校验,规避路径注入与误删,降低线上事故风险
内置错误捕获与友好提示,快速定位问题来源,减少排查时间与沟通成本
根据场景智能选择读写模式与锁策略,兼顾并发与性能,避免数据竞争
按需生成日志记录、上传处理、配置读写等模板,轻松套用到常见业务
支持参数化输入文件名与操作类型,一次配置,多场景复用,显著提升效率
严格遵循主流版本规范与安全实践,避免过时用法,让代码更稳更易维护
生成配套操作说明与安全建议,新手也能快速上手,团队协作交付更顺畅
可选开启路径白名单与目录隔离,保护敏感文件,满足合规与审计要求
一键导出完整代码片段与注意事项,方便粘贴到项目,减少评审返工

🎯 解决的问题

用一次清晰输入,生成一整套“能直接上线”的PHP文件操作方案:包含可执行代码(读取/写入/追加/日志等)、贴心注释、使用步骤、安全提示与常见错误处理,帮助个人与团队以分钟级速度完成从需求到交付。通过专家级角色与标准化输出,显著降低安全风险与审查成本,统一团队代码风格,减少返工,推动用户快速试用并形成稳定付费使用。

🕒 版本历史

当前版本
v2.1 2024-01-15
优化输出结构,增强情节连贯性
  • ✨ 新增章节节奏控制参数
  • 🔧 优化人物关系描述逻辑
  • 📝 改进主题深化引导语
  • 🎯 增强情节转折点设计
v2.0 2023-12-20
重构提示词架构,提升生成质量
  • 🚀 全新的提示词结构设计
  • 📊 增加输出格式化选项
  • 💡 优化角色塑造引导
v1.5 2023-11-10
修复已知问题,提升稳定性
  • 🐛 修复长文本处理bug
  • ⚡ 提升响应速度
v1.0 2023-10-01
首次发布
  • 🎉 初始版本上线
COMING SOON
版本历史追踪,即将启航
记录每一次提示词的进化与升级,敬请期待。

💬 用户评价

4.8
⭐⭐⭐⭐⭐
基于 28 条评价
5星
85%
4星
12%
3星
3%
👤
电商运营 - 张先生
⭐⭐⭐⭐⭐ 2025-01-15
双十一用这个提示词生成了20多张海报,效果非常好!点击率提升了35%,节省了大量设计时间。参数调整很灵活,能快速适配不同节日。
效果好 节省时间
👤
品牌设计师 - 李女士
⭐⭐⭐⭐⭐ 2025-01-10
作为设计师,这个提示词帮我快速生成创意方向,大大提升了工作效率。生成的海报氛围感很强,稍作调整就能直接使用。
创意好 专业
COMING SOON
用户评价与反馈系统,即将上线
倾听真实反馈,在这里留下您的使用心得,敬请期待。
加载中...