Güncelleme : Sorunun hosting firmasının exec() fonksiyonu kısıtlamasından kaynaklandığını tespit ettim. Sistem kurgum tamam ama exec() kısıtlamasına takılmayacak alternatif yöntem aramaktayım.
Tekrar merhabalar, alttaki gibi bir yapı oluşturdum. Veritabanında dosya yolunu ve işlemin yapılması gerektiği zaman bilgilerini tutuyorum. Ancak başarılı sonuç elde edemiyorum.
cronjob_manager.php dosyasına 777 yetkilendirmesi yaptım ve cpanel cron görevleri üzerinde dakikada bir çalışacak şekilde ayarladım. Bu sayfa dakikada bir çalışıyor ve veritabanından veriyi çekiyor buraya kadar sorun yok.
cronjob_manager_tester.php dosyasını ise tarayıcıda çalıştırdığımda çalışıp veritabanına log kaydını yapıyor burada da sorun yok. Ancak belirtilen zamanda cronjob_manager.php dosyası çalıştırması gereken dosya bilgilerini çekiyor ve failed'a düşüyor.
dosya yolu olarak cpanelde kullandığımız gibi (alltta örneğini verdim) kullanıyorum. manager dosya ile tester dosya aynı dizinde ve bunlar bir subdomainde yer alıyor. Farklı dosya yolu alternatifleri de denedim ancak başarılı olamadım. Nerede yanlış yapıyor olabilirim ?
php /home/kullanıcıadı/sub.domain.com.tr/settings/cron_manager_tester.php
cron_manager.php dosyası :
<?php
require_once '../config/dbconnect.php';
date_default_timezone_set('Europe/Istanbul');
function getPendingCronJobs($conn) {
$stmt = $conn->prepare("
SELECT * FROM cron_jobs
WHERE
status = 'pending' AND
(
last_run IS NULL OR
TIMESTAMPDIFF(MINUTE, last_run, NOW()) >= run_interval_minutes
) AND
(
run_at_hour = HOUR(NOW()) AND run_at_minute = MINUTE(NOW())
)
");
$stmt->execute();
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
function updateCronJobStatus($conn, $id, $status) {
$stmt = $conn->prepare("UPDATE cron_jobs SET status = :status, last_run = NOW() WHERE id = :id");
$stmt->bindParam(':status', $status);
$stmt->bindParam(':id', $id);
$stmt->execute();
}
function runCronJob($job) {
$output = null;
$result = null;
$phpPath = '/usr/bin/php';
$command = $phpPath . ' ' . $job['command'] . ' 2>&1';
exec($command, $output, $result);
$output = implode("\n", $output);
file_put_contents('cron_error_log.txt', "Command: {$command}\nOutput: {$output}\nResult: {$result}\nDate: " . date('Y-m-d H:i:s') . "\n\n", FILE_APPEND);
return $result === 0 ? 'completed' : 'failed';
}
$cronJobs = getPendingCronJobs($conn);
foreach ($cronJobs as $job) {
updateCronJobStatus($conn, $job['id'], 'running');
$status = runCronJob($job);
updateCronJobStatus($conn, $job['id'], $status);
}
?>
cron_manager_tester.php Dosyası :
<?php
date_default_timezone_set('Europe/Istanbul');
require_once '../config/dbconnect.php';
try {
$currentDateTime = date("Y-m-d H:i:s");
// Veri girişini oluştur
$text = "Tester 1 Çalıştı. Zaman : " . $currentDateTime;
// Veritabanına veri ekleme sorgusu
$stmt = $conn->prepare("INSERT INTO cron_tester (text) VALUES (:text)");
$stmt->bindParam(':text', $text);
$stmt->execute();
echo "Veri başarıyla eklendi.";
} catch(PDOException $e) {
echo "Veri eklerken bir hata oluştu: " . $e->getMessage();
}
?>
Yaptığı testlerde xml 'i okumanın timeout hatasına sebep vermediği veritabanı kayıt işlemlerinin buna neden olduğunu tespit ettim. XML 'den verilerin okunması 1 saniyenin altında sürüyor ancak veritabanına kayıt uzun sürüyor.
bunu aşabilmek için transaksiyon fonksyionu kullanarak güncellemeleri toplu yaptım ancak genede çözüm olmadı.
Sorunumu çözebildim, araştırmalarım nihayetinde woocommerce'nin ana ürün ve varyant fiyatlarının wp_options tablosunda önbellekleme niteliğinde tuttuğunu ve buradaki satırın güncellenmesinin sadece ürünün panel üzerinden güncellenmesi ve yeni kayıt oluşturduğunda yapıldığını tespit ettim. Ben ise varyant stok ve fiyat bilgilerini entegrasyonum ile direkt veritabanı üzerinden değiştirdiğim için bu güncellemeyi yapmıyordu.
WooCommerce'de bulunan wc_delete_product_transients() fonksiyonu bu önbelleklemeyi güncelliyormuş. Buna istinaden aşağıdaki kod yardımıyla ürün stok ve fiyat bilgilerimi gncelledikten sonra fonksiyonu çağırıp sorunumu çözmüş oldum. Benzer sorun yaşayacaklar için kodu bıraya bırakmaktayım.
<?php
require_once('../wp-load.php');
$args = array(
'post_type' => 'product',
'post_status' => 'publish',
'posts_per_page' => -1,
'post_parent' => 0, // Sadece ana ürünleri almak için post_parent'ı 0 olarak ayarlayın
);
$products = get_posts( $args );
foreach ( $products as $product ) {
wc_delete_product_transients( $product->ID );
}
echo "Tüm ana ürünlerin fiyatları başarıyla güncellendi.";
?>
Cevabınız için teşekkür ederim.
$array = array(
"barcode"=>$trendyol_barcode1,
"quantity"=>$vStockAmount,
"salePrice"=>$trendyol_sale_price,
"listPrice"=>$trendyol_sale_price
);
$json = json_encode($array);
bu şekilde php tarafında json dosyası olarak encode ettim fakat "items"'i nasıl bu json içerisine dahil edeceğimi bilemiyorum.
foreach($cikti_json as $key => $value){
$orderNum=$value["orderNumber"];
echo $orderNum ."<br/>";
}
bu şekilde foreach ile tüm belirtilen etiketleri çekmede de başarılı olamadım ne yazik ki sorunum nerede anlayamadım.
efendim cevabını için teşekkür ederim ancak şöyle bir problem yaşamaktayım.
$cikti_json=json_decode($cikti);
echo "<pre>";
print_r($cikti_json);
bu şekilde kullandığımda sorunsuz ekrana tüm verileri yazdırıyorum ancak
$cikti_json=json_decode($cikti, true);
echo $cikti_json['shipmentAddress'];
bu şekilde diziyi çözüp yazdırmaya çalıştığımda herhangi bir çıktı alamıyorum, ne tür bir hata yapmaktayım acaba ?
Hep bilgi alıyoruz buradan sayenizde bu sefer çözmüş olduğum problem paylaşayım. Biraz curl ile ilgili araştırma yapıp mantığını öğrenince youtubedaki birkaç örnek sayesinde alt kısımdaki kod parçası ile sipariş paketlerini çekebildim. Araştıran arkadaşlara destek olabilmek amacıyla burada kalsın.
API dökümanındaki bilgiler ile tarih aralığı vb. şekilde siparişleri çekebilirsiniz.
<?php
$url = 'https://api.trendyol.com/sapigw/suppliers/SATICIID/orders';
$baglan=curl_init();
curl_setopt($baglan,CURLOPT_URL,$url);
curl_setopt($baglan,CURLOPT_RETURNTRANSFER,1);
curl_setopt($baglan,CURLOPT_USERPWD,"APIKEY:APISECRET");
$cikti=curl_exec($baglan);
curl_close($baglan);
$cikti_json=json_decode($cikti);
echo "<pre>";
print_r($cikti_json);
?>
Üstadım cevabınız için teşekkür ederim ancak burayı uyguladığımda hem hata aldım hem de buranın mantığını anlayamadım. Mantığı anlayarak ilerlemek istiyorum, eğer mümkünse olması gereken akışı özet geçebilmeniz mümkünse çok sevinirim.