Prezentáció BLOB-ok kezelése PHP-ben a memóriahatékony használatért

Áttekintés

Az Aspose.Slides BLOB-alapú kezelést biztosít a prezentációkban lévő nagy bináris adatokhoz, hogy csökkentse a memóriahasználatot nagy képek, hangok, videók és prezentációs fájlok kezelésekor.

Ez a cikk bemutatja, hogyan használhatja a BLOB-alapú feldolgozást nagy médiafájlok hozzáadásához egy prezentációhoz, nagy médiafájlok exportálásához a prezentációból, valamint nagy prezentációk hatékonyabb betöltéséhez. Emellett ismerteti, hogyan használhatók ideiglenes fájlok a feldolgozás során, és hogyan változtatható meg a tárolásukhoz használt mappa.

A BLOB-ról

BLOB (Binary Large Object) általában nagy elemet (fénykép, prezentáció, dokumentum vagy média) jelent, amely bináris formátumban van tárolva.

Az Aspose.Slides for PHP via Java lehetővé teszi a BLOB-ok használatát objektumok esetén úgy, hogy csökkenti a memóriahasználatot nagy fájlok esetén.

BLOB használata a memóriahasználat csökkentéséhez

Nagy fájl hozzáadása BLOB-on keresztül egy prezentációhoz

Aspose.Slides for Java lehetővé teszi, hogy nagy fájlokat (jelen esetben egy nagy videófájlt) BLOB-okon keresztül adjon hozzá, ezáltal csökkentve a memóriahasználatot.

Ez a Java kód megmutatja, hogyan adhat hozzá egy nagy videófájlt BLOB folyamaton keresztül egy prezentációhoz:

  $pathToVeryLargeVideo = "veryLargeVideo.avi";
  # Új prezentációt hoz létre, amelyhez a videó hozzáadódik
  $pres = new Presentation();
  try {
    $fileStream = new Java("java.io.FileInputStream", $pathToVeryLargeVideo);
    try {
      # Adjunk hozzá egy videót a prezentációhoz – a KeepLocked viselkedést választottuk, mert
      # nem szándékozunk hozzáférni a "veryLargeVideo.avi" fájlhoz.
      $video = $pres->getVideos()->addVideo($fileStream, LoadingStreamBehavior->KeepLocked);
      $pres->getSlides()->get_Item(0)->getShapes()->addVideoFrame(0, 0, 480, 270, $video);
      # Elmenti a prezentációt. Miközben egy nagy prezentáció kerül kiírásra, a memóriahasználat
      # alacsony marad a pres objektum életciklusa során
      $pres->save("presentationWithLargeVideo.pptx", SaveFormat::Pptx);
    } finally {
      if (!java_is_null($fileStream)) {
        $fileStream->close();
      }
    }
  } catch (JavaException $e) {
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

Nagy fájl exportálása BLOB-on keresztül egy prezentációból

Az Aspose.Slides for PHP via Java lehetővé teszi, hogy nagy fájlokat (jelen esetben egy hang- vagy videófájlt) BLOB-okon keresztül exportáljon a prezentációkból. Például előfordulhat, hogy egy nagy médiafájlt szeretne kicsomagolni egy prezentációból, de nem akarja, hogy a fájl a számítógép memóriájába töltődjön. A BLOB folyamaton keresztüli exportálással alacsony memóriahasználatot érhet el.

Ez a kód demonstrálja a leírt műveletet:

  $hugePresentationWithAudiosAndVideosFile = "LargeVideoFileTest.pptx";
  $loadOptions = new LoadOptions();
  # Zárolja a forrásfájlt, és NEM tölti be a memóriába
  $loadOptions->getBlobManagementOptions()->setPresentationLockingBehavior(PresentationLockingBehavior->KeepLocked);
  # Létrehozza a Presentation példányt, és zárolja a "hugePresentationWithAudiosAndVideos.pptx" fájlt.
  $pres = new Presentation($hugePresentationWithAudiosAndVideosFile, $loadOptions);
  try {
    # Mentsük el minden videót egy fájlba. A magas memóriahasználat megelőzéséhez egy puffert kell használnunk
    # az adat átviteléhez a prezentáció videóstreamjéből egy újonnan létrehozott videó fájl streamjébe.
    $Array = new JavaClass("java.lang.reflect.Array");
    $Byte = new JavaClass("java.lang.Byte");
    $buffer = $Array->newInstance($Byte, 8 * 1024);
    # Végig iterál a videókon
    for($index = 0; $index < java_values($pres->getVideos()->size()) ; $index++) {
      $video = $pres->getVideos()->get_Item($index);
      # Megnyitja a prezentáció videó streamjét. Kérjük, vegye figyelembe, hogy szándékosan elkerültük a tulajdonságok elérését
      # például a video.BinaryData - mivel ez a property egy teljes videót tartalmazó byte tömböt ad vissza, ami
      # a memóriába betölt byte-okat eredményez. A video.GetStream-et használjuk, amely Stream-et ad vissza – és NEM
      # igényli, hogy a teljes videót a memóriába töltsük.
      $presVideoStream = $video->getStream();
      try {
        $outputFileStream = new Java("java.io.FileOutputStream", "video" . $index . ".avi");
        try {
          $bytesRead;
          while ($bytesRead = $presVideoStream->read($buffer, 0, java_values($Array->getLength($buffer))) > 0) {
            $outputFileStream->write($buffer, 0, $bytesRead);
          } 
        } finally {
          $outputFileStream->close();
        }
      } finally {
        $presVideoStream->close();
      }
      # A memóriahasználat alacsony marad a videó vagy a prezentáció méretétől függetlenül.
    }
    # Szükség esetén ugyanazokat a lépéseket alkalmazhatja audio fájlokra.
  } catch (JavaException $e) {
  } finally {
    $pres->dispose();
  }

Kép hozzáadása BLOB-ként egy prezentációhoz

A ImageCollection osztály módszereivel egy nagy képet adhat hozzá streamként, hogy BLOB-ként kezelje.

Ez a PHP kód megmutatja, hogyan adhat hozzá egy nagy képet BLOB folyamaton keresztül:

  $pathToLargeImage = "large_image.jpg";
  # új prezentációt hoz létre, amelyhez a kép hozzáadódik.
  $pres = new Presentation();
  try {
    $fileStream = new Java("java.io.FileInputStream", $pathToLargeImage);
    try {
      # Adjunk hozzá egy képet a prezentációhoz – a KeepLocked viselkedést választjuk, mert
      # NEM szándékozunk hozzáférni a "largeImage.png" fájlhoz.
      $img = $pres->getImages()->addImage($fileStream, LoadingStreamBehavior->KeepLocked);
      $pres->getSlides()->get_Item(0)->getShapes()->addPictureFrame(ShapeType::Rectangle, 0, 0, 300, 200, $img);
      # Elmenti a prezentációt. Miközben egy nagy prezentáció kerül kiírásra, a memóriahasználat
      # alacsony marad a pres objektum életciklusa során
      $pres->save("presentationWithLargeImage.pptx", SaveFormat::Pptx);
    } finally {
      if (!java_is_null($fileStream)) {
        $fileStream->close();
      }
    }
  } catch (JavaException $e) {
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

Memória és nagy prezentációk

Általában egy nagy prezentáció betöltéséhez a számítógépeknek sok ideiglenes memóriare van szükségük. A prezentáció összes tartalma betöltődik a memóriába, és a fájl (amelyből a prezentáció betöltődött) már nem használódik.

Vegyünk egy nagy PowerPoint prezentációt (large.pptx), amely egy 1,5 GB videófájlt tartalmaz. A prezentáció betöltésének szabványos módja ebben a PHP kódban van leírva:

  $pres = new Presentation("large.pptx");
  try {
    $pres->save("large.pdf", SaveFormat::Pdf);
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

Ez a módszer azonban körülbelül 1,6 GB ideiglenes memóriát fogyaszt.

Nagy prezentáció betöltése BLOB-ként

A BLOB-ot alkalmazó folyamat segítségével egy nagy prezentációt betölthet kevesebb memóriával. Ez a PHP kód leírja a megvalósítást, ahol a BLOB folyamatot használják a nagy prezentációs fájl (large.pptx) betöltéséhez:

  $loadOptions = new LoadOptions();
  $loadOptions->getBlobManagementOptions()->setPresentationLockingBehavior(PresentationLockingBehavior->KeepLocked);
  $loadOptions->getBlobManagementOptions()->setTemporaryFilesAllowed(true);
  $pres = new Presentation("large.pptx", $loadOptions);
  try {
    $pres->save("large.pdf", SaveFormat::Pdf);
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

Az ideiglenes fájlok mappájának módosítása

Amikor a BLOB folyamatot használja, a számítógép ideiglenes fájlokat hoz létre az alapértelmezett ideiglenes fájlok mappájában. Ha azt szeretné, hogy az ideiglenes fájlok egy másik mappában legyenek tárolva, a setTempFilesRootPath metódussal módosíthatja a tárolási beállításokat:

  $loadOptions = new LoadOptions();
  $loadOptions->getBlobManagementOptions()->setPresentationLockingBehavior(PresentationLockingBehavior->KeepLocked);
  $loadOptions->getBlobManagementOptions()->setTemporaryFilesAllowed(true);
  $loadOptions->getBlobManagementOptions()->setTempFilesRootPath("temp");

Presentációs objektumok felszabadítása a memória felszabadításához

Nagy prezentációk feldolgozásakor ügyeljen arra, hogy a Presentation példány megfelelően legyen felszabadítva, így a memória, amelyet elfoglalt, felszabadul. Hívja a dispose() metódust, miután befejezte a prezentáció használatát, hogy felszabadítsa a nem kezelt erőforrásokat.

$presentation = new Presentation("large.pptx");

# ...feldolgozza a prezentációt...
$presentation->save("large.pdf", SaveFormat::Pdf);

# Kifejezetten felszabadítja az erőforrásokat.
$presentation->dispose();

GYIK

Mely adatot kezel az Aspose.Slides prezentációban BLOB-ként, és melyik BLOB beállítás szabályozza?

Nagy bináris objektumok, mint például képek, hangok és videók kezelhetők BLOB-ként. A teljes prezentációs fájl is BLOB-kezelést von maga után, amikor betöltődik vagy mentésre kerül. Ezeket az objektumokat BLOB-szabályok irányítják, amelyek lehetővé teszik a memóriafelhasználás kezelését és az ideiglenes fájlok használatát szükség esetén.

Hol konfigurálhatom a BLOB-kezelési szabályokat a prezentáció betöltése során?

Használja a LoadOptions osztályt a BlobManagementOptions segítségével. Itt állíthatja be a memóriakorlátot BLOB-okhoz, engedélyezheti vagy letilthatja az ideiglenes fájlokat, kiválaszthatja az ideiglenes fájlok gyökérútvonalát, valamint a forrászár viselkedését.

A BLOB-beállítások befolyásolják a teljesítményt, és hogyan találhatok egyensúlyt a sebesség és a memória között?

Igen. A BLOB memóriában tartása maximalizálja a sebességet, de növeli a RAM-igényeket; a memóriakorlát csökkentése több munkát helyez át az ideiglenes fájlokra, csökkentve a RAM-igényt, de többlet I/O-val. Használja a setMaxBlobsBytesInMemory metódust a megfelelő egyensúly eléréséhez a terhelése és a környezete szerint.

Segítenek a BLOB-beállítások nagyon nagy prezentációk (például gigabájtok) megnyitásakor?

Igen. A BlobManagementOptions kifejezetten ilyen forgatókönyvekre van tervezve: az ideiglenes fájlok engedélyezése és a forrászár használata jelentősen csökkentheti a csúcs RAM-felhasználást és stabilizálhatja a feldolgozást nagyon nagy bemutatók esetén.

Használhatok BLOB-szabályokat stream-ekből való betöltésnél a lemezfájlok helyett?

Igen. Ugyanazok a szabályok vonatkoznak a stream-ekre is: a prezentáció példány tulajdonolhatja és zárolhatja a bemeneti streamet (a választott zárolási módtól függően), és az ideiglenes fájlok használata akkor is megtörténik, ha engedélyezve van, ezáltal a memóriahasználat kiszámítható marad a feldolgozás során.