PHP中是否有办法通过URL的取得其返回?
大家讲道理
大家讲道理 2017-04-10 15:35:24
[PHP讨论组]

例如这里是一个a.php:


b.php, 从用户输入得到了一个URL, 正好是/a.php?b:

assert($_GET["wanted"] === '/a.php?b');
// 是否存在一个方法whatever, 令:
$result = whatever($_GET["wanted"]);
echo strtoupper($result); // THESE'S A "B".

这些答案是不接受的:

  • file_get_contents()fopen() 发起远程请求: 服务器未必Listen了localhost, 域名也是不确定的, 并且发起远程请求开销太大.
  • 重定向: 得到返回内容以后还要进一步处理.
  • includerequire_once: 实际情况可能很复杂, 包括url mapping等等, 根本不知道 include 哪个文件. 另外这个URL还有可能是静态文件.

更新 20140511:

貌似因为我刻意隐藏项目中的问题, 所以很难让人清楚, 非常抱歉. 简单来说, 我就是希望能得到whatever()的一种实现.

我在项目中遇到的问题是这样的. 一个网页, HTML中有一些JS和CSS的资源, 可以直接行内展开. 如果JS和CSS全部是静态这样好办, 直接读入文件然后用正则替换上去就是了. 然而某些JS是需要根据用户输入动态生成的, 这样就必须要请求到这些PHP生成的JS, 然后再替换上去.

项目中将所有url都Rewrite到index.php, 然后在index.php做url mapping. 包括当前的网页, 和希望得到内容的JS, 都通过index.php然后再生成.

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全部回复(2)
黄舟
  1. 是有办法实现你说的要求的,思路是这样的:
    1) 第一种思路:在运行b.php中运行a.php,并且捕获a.php的标准输出作为方法的返回,这个需要事先构造出运行a.php的环境,比如设置query值,即a.php里的$_GET。
    a)如何运行a.php并捕获标准输出,可以参考pipe(管道)方式;
    b)如何构造运行环境,可以参考CGI的环境变量进行设置。
    c)这种方式是需要额外运行一个进程来进行处理的,所以性能并不是很好,不好作为线上用途。

    2) 第二种思路:实现一个简单的php解释器,来运行这个a.php;
    a)这种方式比较复杂,但性能比第一个要好。

    3) 可能会有部分第三方或者开源类库实现了已有功能,这个需要你自行查找。

  2. 然后大概听了你说的这些,感觉从需求上分析,你选用的方案应该是有问题,所以才造成了这么麻烦的实现方式。当然不清楚你项目的实际困难,是否只能采取这种方式,但如果是从头开始的话,推荐是将a.php的实现抽象出来,然后a.php和b.php分别调用才是更合理的方案。

巴扎黑

没搞明白你想做什么,你的方案有问题

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号