#php #ajax #for-loop #pdf-generation #tcpdf
Вопрос:
Я ищу помощи в том, как заставить это запустить скрипт, сохранить PDF-файл, перейти на следующую итерацию страницы, опубликовать и обновить страницу и запустить следующий цикл до конца.
Я не смог найти надежного способа сделать это для своего приложения. Я нашел несколько различных фрагментов кода в разных вариантах сценариев (в основном ajax), но ни один из стандартных не кажется подходящим. У меня слишком много переменных, которые находятся в игре.
Мои PDF-файлы выводятся просто отлично, и я в порядке со временем, которое на это уходит, но на каждый PDF-файл приходится более 1 миллиона кодов, и я перехожу границы памяти.
В конечном счете это выполняется на изолированном, удаленном от сети, выделенном компьютере, который ничего не делает, кроме запуска этой системы, поэтому не беспокоится о безопасности или использовании ресурсов ни для чего, кроме проблем с запуском кода.
Примерно раз в год я пишу тяжелый код для новых внутренних проектов, поэтому мои навыки неоднозначны, но я быстро учусь. Мне просто каждый раз приходится переучиваться почти всему. Что затрудняет это.
Вот мой исходный код:
if (isset($_POST["import"])) {
$VARno = $_POST["VARno"];
$rowId = $_POST["rowId"];
$batchpages = 1000;
$startpage = 1;
$maxSheet = 12300;
for ($s = 0; $s <= $rowId; $s) {
$startSheet = $startpage;
$endSheet = $startpage ($batchpages - 1);
$loopCount = ceil(($maxSheet-$startpage) / $batchpages);
if (isset($_POST["makeCodes" . $s])) {
for ($l = 0; $l < $loopCount; $l) {
$skidNo = $_POST["skidNo_" . $s];
$dateSet = date('m/d/Y H:i:s', time()-(7*60*60));
$tableName = "VAR" . $VARno;
$finalSkidNo = substr($VARno, -2) . str_pad($skidNo, 4, "0", STR_PAD_LEFT);
$ptQuery = "SELECT PTvalue, sheetsPerSkid, codesPerSheet, Xstart, Ystart, QRsize, rotation, shellH, shellW, noAcross FROM mt_status WHERE MT = ?";
$paramType = "s";
$paramArray = array($VARno);
$ptResult = $db->select($ptQuery, $paramType, $paramArray);
foreach ($ptResult as $ptRow) {
$PTvalue = $ptRow['PTvalue'];
$lastPos = $ptRow['codesPerSheet'];
$lastSheet = $ptRow['sheetsPerSkid'];
$xStart = $ptRow['Xstart'];
$yStart = $ptRow['Ystart'];
$xShift = $ptRow['shellW'];
$yShift = $ptRow['shellH'];
$QRsize = $ptRow['QRsize'];
$QRrotate = $ptRow['rotation'];
$noAcross = $ptRow['noAcross'];
break;
}
$sqlSelect = "SELECT $tableName.id, sheetNo, posNo, URL FROM $tableName WHERE skidNo = ? AND sheetNo >= ? AND sheetNo <= ? ORDER BY $tableName.id";
$paramType = "sss";
$paramArray = array($skidNo, $startSheet, $endSheet);
$result = $db->select($sqlSelect, $paramType, $paramArray);
if ($endSheet > $lastSheet) {
$endSheet = $lastSheet;
}
// create new PDF document
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
// set default header data
$pdf->setPrintHeader(false);
$pdf->setPrintFooter(false);
// set margins
$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
// set auto page breaks
$pdf->SetAutoPageBreak(TRUE, 0);
// Add a page
$pdf->AddPage('P', $page_format, false, false);
$style = array(
'border' => 0,
'vpadding' => 0,
'hpadding' => 0,
'fgcolor' => array(0,0,0),
'bgcolor' => false,
'module_width' => 0.1, // width of a single module in points
'module_height' => 0.1 // height of a single module in points
);
$x = $xStart;
$y = $yStart;
$p = 1;
$r = 1;
foreach($result as $row) {
$pdf->SetFont('helvetica', '', 5, '', true);
$VARTagH = 0.0945;
$VARTagW = 0.08;
if ($row['posNo'] == 1) {
$x = $xStart;
$y = $yStart;
$p = 1;
$r = 1;
if (substr($row['sheetNo'], -3) == 1) {
$pdf->Rect(0, 1, 0.25 , 1, 'F', false, array(0,0,0));
}
$pdf->StartTransform();
$pdf->Rotate($QRrotate, ($x ($QRsize / 2)), ($y ($QRsize / 2)));
$pdf->writeHTMLCell(($QRsize $VARTagW), $VARTagH, ($x), ($y - $VARTagH), $VARno, 0, 1, 0, true, 'R', false);
$pdf->write2DBarcode($row['URL'], 'QRCODE,M', $x, $y, $QRsize, $QRsize, $style, 'T');
$pdf->StopTransform();
$x = $x $xShift;
$p;
}
elseif ($row['posNo'] > 1 amp;amp; $row['posNo'] < $lastPos){
if ($p < $noAcross) {
$pdf->StartTransform();
$pdf->Rotate($QRrotate, ($x ($QRsize / 2)), ($y ($QRsize / 2)));
$pdf->writeHTMLCell(($QRsize $VARTagW), $VARTagH, ($x), ($y - $VARTagH), $VARno, 0, 1, 0, true, 'R', false);
$pdf->write2DBarcode($row['URL'], 'QRCODE,M', $x, $y, $QRsize, $QRsize, $style, 'T');
$pdf->StopTransform();
$x = $x $xShift;
$p;
}
elseif ($p == $noAcross) {
$pdf->StartTransform();
$pdf->Rotate($QRrotate, ($x ($QRsize / 2)), ($y ($QRsize / 2)));
$pdf->writeHTMLCell(($QRsize $VARTagW), $VARTagH, ($x), ($y - $VARTagH), $VARno, 0, 1, 0, true, 'R', false);
$pdf->write2DBarcode($row['URL'], 'QRCODE,M', $x, $y, $QRsize, $QRsize, $style, 'T');
$pdf->StopTransform();
$x = $xStart;
$y = $y $yShift;
$p = 1;
$r;
}
}
elseif ($row['posNo'] == $lastPos) {
$foottag = "VAR" . $VARno . " - Skid #" . $finalSkidNo . " - " . $dateSet . " - " . $row['sheetNo'] . " of " . $lastSheet . " - Verified by: ____________ Date: _____/_____/_________";
$pdf->StartTransform();
$pdf->Rotate($QRrotate, ($x ($QRsize / 2)), ($y ($QRsize / 2)));
$pdf->writeHTMLCell(($QRsize $VARTagW), $VARTagH, ($x), ($y - $VARTagH), $VARno, 0, 1, 0, true, 'R', false);
$pdf->write2DBarcode($row['URL'], 'QRCODE,M', $x, $y, $QRsize, $QRsize, $style, 'T');
$pdf->StopTransform();
$pdf->SetFont('Courier', 'B', 10, '', true);
$pdf->writeHTMLCell(12.5, .25, 0.25, 18.5, $foottag, 0, 1, 0, true, 'R', false);
$x = $xStart;
$y = $yStart;
$p = 1;
$r = 1;
if ($row['sheetNo'] < $endSheet){
$pdf->AddPage('P', $page_format, false, false);
}
}
}
$save_here = "C:\MT" . $VARno . "\" . $VARno . "-" . $finalSkidNo . " - " . $startSheet . "-" . $endSheet . ".pdf";
// Close and output PDF document
// This method has several options, check the source code documentation for more information.
$pdf->Output($save_here, 'F');
$startSheet = $startSheet $batchpages;
$endSheet = $endSheet $batchpages;
}
$type = "success";
$message .= "All QR codes for " . $finalSkidNo . " created.</br>n";
}
}
}
Я уже запускал что-то подобное до того, как это было вызвано при загрузке страницы:
function genproofs(id) {
var itemid = id;
var imgpath = '/path/' itemid '.jpg?rand=' Math.random();
function updateimage(){
var myImageElement = document.getElementById('cardproof');
myImageElement.src = imgpath;
$(".floater").show();
$(".delay").hide();
}
function genJPG(){
$.ajax({
type: 'GET',
cache: false,
url: '/path/gen_jpg.php',
data: { itemid : itemid },
success: function() {
setTimeout(updateimage, 500);
}
});
}
$.ajax({
type: 'GET',
cache: false,
url: '/path/gen_pdf.php',
data: { itemid : itemid },
success: function(){
setTimeout(genJPG, 1000);
}
});
}
Я думаю, что это близко. Я думаю, что в какой-то момент мне нужно будет вызвать ajax для запуска вместо встроенного цикла for и передать переменные итерации страницы таким образом. Сохранение каждого PDF-файла, затем возврат, обновление переменных и повторение до тех пор, пока i = x. Я просто не уверен, где / как вызвать ajax и как заставить его опубликовать обновление и повторно подключиться.
Это, вероятно, будет «да» решением, но я упираюсь в стену.