我创建了一个脚本来导入CSV文件。当我用php命令在服务器上手动运行脚本时,脚本运行没有问题。另一方面,当crontab执行时,会出现错误:
SPLFILEOBJECT :: __ CONSTRUCT(IMPORTS / STOCK_EXPRESS_FR.CSV):失败于 开放式流:没有此类文件或目录。
这是我的导入脚本。
<?php
require(dirname(__FILE__) . '/config/config.inc.php');
$dir_fichier = 'IMPORTS/STOCK_EXPRESS_FR.csv';
//error_reporting(E_ALL);
ini_set('display_errors', 0);
tntProduct($dir_fichier);
function tntProduct($dir_fichier)
{
$errors = [];
try{
$csv = new SplFileObject($dir_fichier);
$csv->setFlags(SplFileObject::READ_CSV);
$csv->setCsvControl(';');
} catch (Exception $exception) {
$errors[] = $exception->getMessage();
}
$nbProducts = 0;
$nbProductsSuccess = 0;
foreach ($csv as $ligne) {
if ($ligne[1] === '0') {
$result = getIdsProducts($ligne[0]);
if (!empty($result)) {
foreach ($result as $key => $item) {
$nbProducts++;
try {
setCarrier($item['id_product']);
$nbProductsSuccess++;
}catch (Exception $exception) {
$errors[] = $exception->getMessage();
}
}
}
}
}
if (count($errors)>0) {
sendMail($errors);
} else {
sendMail($nbProducts);
}
if (file_exists ($dir_fichier)) {
unlink($dir_fichier);
}
}
function getIdsProducts($ref)
{
$sql = Db::getInstance()->executeS('
SELECT p.id_product
FROM ' . _DB_PREFIX_ . 'product p
WHERE p.reference = ' . '"' . $ref . '"');
return $sql;
}
function setCarrier($productId)
{
$shop = 1;
$carriersFR = [
0 => 1,
1 => 72,
2 => 87
];
$products = new Product((int)$productId, false, 1, $shop);
$products->setCarriers($carriersFR);
}
function sendMail($result)
{
$data['{message}'] = $result;
Mail::Send(
1,
'tnt_fr',
'Mise à jour TNT France',
$data,
'test@test.fr',
'test',
null,
null,
null,
true,
_PS_MAIL_DIR_,
false,
1
);
}
你对这个问题有想法吗?谢谢您的帮助
答案 0 :(得分:0)
在crontab中运行脚本,该脚本不在文件夹中,因此您需要编写完整路径或正确的相对路径。