来自php的dump-autoload命令

我正在构建一个Web应用程序,用户可以动态地从Web浏览器上传Controllers php文件。 所有这些都存在问题。</ p>

由于每个类都应该按照在laravel中使用的顺序进行编译,因此必须执行commmand composer dump-autoload </ code> 。 但我不想从终端手动执行此操作。 在“寄存器类”中,我明确地调用了一些对我没用的命令,例如:</ p>


  • Artisan :: call('dump- autoload'); </ code> </ li>
  • exec(“/ path / to / app / composer dump-autoload”); </ code> </ li>
  • shell_exec('php artisan dump-autoload'); </ code> </ li>
  • shell_exec('composer dump-autoload'); </ code> </ li>
    </ ul>

    仍未找到新控制器。 所以,我不知道我错过了什么。 或者,如果还有另一种动态“加载”我的类的方法。</ p>

    需要考虑的事项:</ h3>


    1. 安全隐患:当然 但我的问题是在执行时间内动态识别新类的问题</ li>
    2. 我完全确定路径,我已经从linux终端测试了每个问题并且一切正常(具有绝对路径和相对路径) )。 出于这些原因,我寻找另一个原因而不是路径。</ li>
    3. 编译后不要忘记实际上“要求”或“包含”该类</ code>当然, 该文件包含在第2点并确认。</ li>
    4. 这看起来很可疑:</ p>


      我的袖手旁观猜测 将是运行php的用户没有足够的权限来执行操作或写入所需的目录</ p>
      </ blockquote>

      然而,怎么可能php没有 没有足够的权限,可能会影响 composer dump-autoclass </ code>命令?</ p> </ li>

    5. Apache / 2.4.9(Fedora)PHP / 5.5.12 </ p> </ li>
      </ ol>
      </ div>

展开原文

原文

I am building a web application where the user dynamically can upload Controllers php files from the web browser. There is a problem in all of this.

Since every class should be compiled in order be used inside of laravel, the commmand composer dump-autoload must be executed. But I do not want to do this manually from the terminal. Inside of a "register class" I have called explicitly some commands that have not worked for me, for example:

  • Artisan::call('dump-autoload');
  • exec("/path/to/app/composer dump-autoload");
  • shell_exec('php artisan dump-autoload');
  • shell_exec('composer dump-autoload');

The new controllers are still not being found. So, I do not know what I am missing. Or if there is another way to "load" my classes dynamically.

Things to consider:

  1. Security implications: of course, but my question is widely open to dynamically recognize new classes in execution time
  2. I am completely sure about paths, I have tested every issue from a linux terminal and all worked fine (with absolute and relative path). For these reasons, I look for another reason instead of paths.
  3. Don't forget to actually 'require' or 'include' the class after you compile it Sure, the file is included and confirmed by the point 2.
  4. This looks suspicious:

    my off-the-cuff guess would be that the user running php doesn't have sufficient privileges to perform the operation or write to the required directories

    However, how could it be possible that php doesn't have enough privileges, could be it affects the composer dump-autoclass command?

  5. Apache/2.4.9 (Fedora) PHP/5.5.12

dsi36131
dsi36131 “但是,如果php没有enoght特权这可能会有可能影响composerdump-autoclass命令?”-因为如果进程无法将编译后的文件写入目录,结果就好像您没有运行该命令一样
6 年多之前 回复
doubo9799
doubo9799 是的,完全确定。为什么?1.因为类被删除在/app/controllers文件夹中。2.因为如果我直接从终端执行composerdump-autoload,那么这些类就会在我的app中加载
6 年多之前 回复
dsgwoh7038
dsgwoh7038 你确定你的作曲家知道在哪里找到这些上传的课程吗?假设您已将文件夹添加到作曲家类图中?
6 年多之前 回复

2个回答



为了解决这个问题,你可以这样做:</ p>

  exec(“composer”  dump-autoload -d / path / to / laravel-project /“); 
</ code> </ pre>

你必须明确告诉作曲家在哪里寻找 composer.json </ code>。</ p>

-d </ code>如果指定使用给定目录作为工作目录</ p>

没有 - d </ code>选项,作曲家假设您的 composer.json </ code>位于 path / to / laravel-project / public / </ code>中。 因为所有请求都被路由到前端控制器 index.php </ code>,这意味着当前工作目录是 public / </ code> </ p>
</ div>

展开原文

原文

Well to work this out you can do this:

exec("composer dump-autoload -d /path/to/laravel-project/");

You have to explicitly tell composer where to look for composer.json.

-d If specified use the given directory as working directory

Without -d option, composer assumes your composer.json lives in path/to/laravel-project/public/. Because all requests are routed to front controller index.php and by that mean the current working directory is public/

dongzhong9055
dongzhong9055 我知道大写字母看起来像刺客,但路径实际上是正确的。 一次又一次地检查
6 年多之前 回复
dpzjl68484
dpzjl68484 如果添加了无效的目录路径,它实际上返回NULL,但如果路径有效,我将获得生成自动加载文件。 重新检查您的绝对目录路径是Laravel还是laravel。
6 年多之前 回复
doudong4532
doudong4532 var_dump(passthru(“composer dump-autoload -d / var / www / html / Laravel /”));. 对不起,这会返回null
6 年多之前 回复
dreamevil0002
dreamevil0002 在一个只有这一行的简单php中,输出是一个零长度的字符串
6 年多之前 回复
dsce23640
dsce23640 尝试使用passthru而不是exec,输出是什么?
6 年多之前 回复
duanjumie8753
duanjumie8753 至少对我不起作用。 我怀疑这个问题可能是linux的一个规则。 我没有其他解释
6 年多之前 回复



这里没有足够的信息来帮助我们。</ p>

需要考虑的事项 :</ p>


  • 只想提及可怕的安全隐患</ li>
  • 我不打算解决路径问题,只要确定它们是 完整而绝对</ li>
  • 我的袖手旁观猜测是运行php的用户没有足够的权限来执行操作或写入所需的目录</ li>
  • 编译后不要忘记实际上“要求”或“包含”该课程</ li>
  • 确保您的自动加载器实际上正在开火,可能还有一些日志记录或类似情况</ li> \ n
  • 确保您没有启用php安全模式,并且在对其进行任何操作之前移动上传的文件</ li>
    </ ul>

    尝试更新您的问题 如果可以的话还有一些额外的信息。</ p>
    </ div>

展开原文

原文

There isn't really enough information here to help us help you.

Things to consider:

  • just want to mention the horrible security implications
  • I'm not going to address path issues, just be sure they're complete and absolute
  • my off-the-cuff guess would be that the user running php doesn't have sufficient privileges to perform the operation or write to the required directories
  • don't forget to actually 'require' or 'include' the class after you compile it
  • make sure that your autoloader is actually firing, maybe with some logging or the like
  • make sure you don't have php safe mode enabled, and that you move the uploaded file before doing any work on it

Try updating your question with some additional information if you can please.

duanbi3786
duanbi3786 我已经更新了这个问题。 如果需要其他信息,请与我们联系。
6 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问