我如何在magento2上运行php自定义脚本


9

我想将自定义php脚本添加到magento2根文件夹并从浏览器运行。我试图将其添加到magento2根文件夹中,但它重定向到404页面。

我也尝试将其添加到pub文件夹中,但没有成功。

还清除了缓存和生成。

我在Nginx服务器上运行magento2


听起来很奇怪。我在magento2根目录中创建了test.php脚本,然后我只是从浏览器http://%magento-base-url%/test.php调用了它,并且可以正常工作。
Valery Statichnyi

我正在nginx服务器上运行magento2
Ranjit Shinde

Answers:


19

如果您使用的是magento随附的nginx配置,则您需要在pub文件夹中放置一个文件,以允许从浏览器访问该文件,因为pub是vhost的文档根目录。Magento根目录为上一级。为nginx的所有默认配置的第二只允许访问index.phpget.phpstatic.phpreport.php404.php503.php文件。php不处理其他任何内容。您可以location ~ (index|get|static|report|404|503)\.php$ {在nginx.conf.sample中看到这一点。如果您不使用它,请检查您的配置中是否存在类似规则。要允许从浏览器访问另一个文件,只需在503之后添加另一个名称,或使用来更改整个方括号location ~* \.php$ {


更改后是否需要重启nginx?
拉维索尼

是的,对vhost的任何更改都至少需要重新加载。
Zefiryn '18年

谢谢男人的工作
Pandurang

12

例如,通过自定义脚本获取产品名称

范例1:

创建 test.php在Magento的根部var/www/html/magento2/test.php

<?php

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
ini_set('memory_limit', '5G');
error_reporting(E_ALL);

use Magento\Framework\App\Bootstrap;
require 'app/bootstrap.php';

$bootstrap = Bootstrap::create(BP, $_SERVER);

$objectManager = $bootstrap->getObjectManager();

$state = $objectManager->get('Magento\Framework\App\State');
$state->setAreaCode('frontend');

$id = 1;
$product = $objectManager->create('\Magento\Catalog\Model\Product')->load($id);

echo $product->getName();

您可以test.php通过以下方式运行脚本

http://127.0.0.1/magento2/test.php

范例2:

步骤1:在magento 2的根目录下创建index.php

var/www/htmlmagento2/test/index.php

<?php
require __DIR__ . '../../app/bootstrap.php';
$bootstrap = \Magento\Framework\App\Bootstrap::create(BP, $_SERVER);
$app = $bootstrap->createApplication('customScript');
$bootstrap->run($app);

步骤2:建立customScript.php

/var/www/html/magento2/test/customScript.php

<?php
class customScript
    extends \Magento\Framework\App\Http
    implements \Magento\Framework\AppInterface {
    public function launch()
    {
        $this->_state->setAreaCode('frontend'); //Set area code 'frontend' or 'adminhtml
        $id = 12;
        $_product = $this->_objectManager->create('\Magento\Catalog\Model\Product')->load($id);

        echo $_product->getName();

        return $this->_response;
    }

    public function catchException(\Magento\Framework\App\Bootstrap $bootstrap, \Exception $exception)
    {
        return false;
    }

}

现在,您可以通过以下方式运行此自定义脚本:

http://127.0.0.1/magento2/test/

在此处输入图片说明


1
我收到错误消息“找不到类customScript”,所以在“ $ app = $ bootstrap-> createApplication('customScript');”之前添加了“ require'./customScript.php”。那行得通。
赞卡尔

我收到页面未找到错误
拉维索尼

1
@ravisoni,这表示您做错了。确保创建文件夹/ test /和两个文件index.php和另一个文件customScript.php
电镀

1
@Zankar,您需要将customScript.php文件与index.php文件放在同一文件夹(sitedir的子文件夹)中。从您的代码中,./customScript.php我可以看到您的customScript.php比index.php高出一个水平
electroid

在我的情况下,@ electroid customScript.php文件位于的目录中index.php。如果要从上一级文件夹中添加它,我会做../customScript.php(请注意两个点)
Zankar,

3

如果您想允许多个 php脚本像我需要的那样可执行(ERP导入产品的import.php,用我的ERP的库存更新的stock.php等):

  • scripts/pub文件夹中创建一个新目录
  • 编辑您的magento虚拟主机并在下面添加行##Allow pub/srcipts/ folder to execute php custom

     listen 80;
     server_name example.com www.example.com;

     set $MAGE_ROOT /var/www/html/magento2;
     include /var/www/html/magento2/nginx.conf.sample;

     ## Allow pub/srcipts/ folder to execute php custom
     location /scripts/ {
        location ~* \.php$ {
                try_files $uri =404;
                fastcgi_pass   fastcgi_backend;
                fastcgi_buffers 1024 4k;

                fastcgi_read_timeout 600s;
                fastcgi_connect_timeout 600s;

                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                include        fastcgi_params;
        }
     }

现在,您可以通过访问以下脚本来运行脚本:

http://www.example.com/scripts/your_custom_code.php

非常有帮助。谢谢。
卢比
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.