Plik do 50 000 wierszy i po przekroczeniu utwórz nowy

0

Posiadam skrypt:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
 
  </head>
<body>
<?php
 $mysqli = new mysqli('127.0.0.1',
        'admin',
        'p3IfewF?I^qsRbk#d,2x', 
        'admin' );

 // mysqli_query("SET NAMES 'latin2'");
function zamiana( $string )
{
				
				// $string = strtolower($string);
				$polskie = array( ',', '-', ' ', 'ę', 'Ę', 'ó', 'Ó', 'Ą', 'ą', 'Ś', 's', 'ł', 'Ł', 'ż', 'Ż', 'Ź', 'ź', 'ć', 'Ć', 'ń', 'Ń', '-', "'", "/", "?", '"', ":", 'ś', '!', '&', '&', '#', ';', '[', ']', 'domena.pl', '(', ')', '`', '%', '”', '„', '…' );
				$miedzyn = array( '-', '-', '-', 'e', 'e', 'o', 'o', 'a', 'a', 's', 's', 'l', 'l', 'z', 'z', 'z', 'z', 'c', 'c', 'n', 'n', '-', "", "", "", "", "", 's', '', '', '', '', '', '', '', '', '', '', '', '', '' );
				$string = str_replace( $polskie, $miedzyn, $string );
				
				// usuń wszytko co jest niedozwolonym znakiem
				$string = preg_replace( '/[^0-9A-Za-z.\-]+/', '-', $string );
				
				// zredukuj liczbę myślników do jednego obok siebie
				// $string = preg_replace('/[\-]+/', '-', $string);
				// usuwamy możliwe myślniki na początku i końcu
				// $string = trim($string, '-');
				$string = stripslashes( $string );
				
				// na wszelki wypadek
				// $string = urlencode($string);
				return $string;
				} 
$page = "https://artelis.pl/";
 $i = 0;
 $list = "";
 // $result2 = mysqli_query($mysqli, "SHOW TABLES");
// while ($row2 = $result2->fetch_object()){
// echo $row2->Tables_in_obswkkar_admin_nowa_prod."<br />";
// }
// $user = mysqli_query($mysqli, "SELECT * FROM patronats_categories");
// while ($row3 =  $user->fetch_object()){
// var_dump($row3);
// }
// echo $page."autor/profil/".$row3->id."/".$row3->slug."<br />";
// autor/profil/184547/
// }
/**
* $result2 = mysqli_query($mysqli, "SHOW TABLES");
* while ($row2 = $result2->fetch_object()){
* echo $row2->Tables_in_obswkkar_admin_nowa_prod."<br />";
* $result3=mysqli_query($mysqli, "DESCRIBE ".$row2->Tables_in_obswkkar_admin_nowa_prod."");
* 
* while ($row3 = $result3->fetch_object()){
* echo $row3->Field." , ";
* }
* echo"<hr />";
* 
* }
*/
// $result2->close();
$mysqli -> query( "SET NAMES 'utf8mb4'" );


 $strony = mysqli_query( $mysqli, "SELECT * FROM static_pages" );
 while ( $row3 = $strony -> fetch_object() ) {
				$list .= rtrim( $page, "/" ) . $row3 -> address . "/n";
				 } 
$lista_artykuly = "";
 $artykul = mysqli_query( $mysqli, "SELECT * FROM articles WHERE status='live' " );
 while ( $row = $artykul -> fetch_object() ) {
				$title = $row -> title;
				 $lista_artykuly .= $page . "artykuly/" . $row -> id . "/" . zamiana( $title ) . "\n";
				 } ;
 $artykul -> close();
 $fp_art = fopen( 'sitemap_art.txt', 'w' );
 fwrite( $fp_art, $lista_artykuly );
 fclose( $fp_art );


 $kategorie = mysqli_query( $mysqli, "SELECT * FROM categories" );
 while ( $row = $kategorie -> fetch_object() ) {
				$list .= $page . $row -> slug . ".html\n";
				 $subkategorie = mysqli_query( $mysqli, "SELECT * FROM subcategories WHERE category_id='" . $row -> id . "' " );
				 while ( $row_sub = $subkategorie -> fetch_object() ) {
								$list .= $page . "kategorie/" . $row -> slug . "/" . $row_sub -> slug . "\n";
								 } 
				} ;
 $kategorie -> close();
 // $artykuly = mysqli_query($mysqli, "SELECT * FROM articles");
// var_dump($artykuly);
// echo $list;

$tagi = mysqli_query( $mysqli, "SELECT * FROM tags GROUP BY slug" );
$it=0;
 while ( $row = $tagi -> fetch_object() ) {
				$list .= $page . "tag/" . $row -> slug . "\n";
                $it++;
                if($it>45000){
                $it=0;
                 $ex = explode( "\n", $list );
 echo count( $ex );
                $fp = fopen( 'sitemap0.txt', 'w' );
 fwrite( $fp, $list );
 fclose( $fp );
 $list="";
                }
				 } ;

 $tagi -> close();
 $lista_user = "";
 $user = mysqli_query( $mysqli, "SELECT * FROM users" );
 while ( $row3 = $user -> fetch_object() ) {
				// echo $page."autor/profil/".$row3->id."/".$row3->slug."<br />";
				$lista_user .= $page . "autor/profil/" . $row3 -> id . "/" . $row3 -> slug . "\n";
				 } 
$fp = fopen( 'sitemap_user.txt', 'w' );
 fwrite( $fp, $lista_user );
 fclose( $fp );
 $user -> close();
 $ex = explode( "\n", $list );
 echo count( $ex );
 $mysqli -> close();
 $fp = fopen( 'sitemap.txt', 'w' );
 fwrite( $fp, $list );
 fclose( $fp );

Dla pliku sitemap_art.txt potrzebuję utworzyć maks 50 000 wierszy, po czym ma się utworzyć nowy plik, również z 50 000 wierszami. Proszę o podpowiedź.

1

Dodajesz po linijce i zwiększasz sobie licznik jak dojdzie do 50k to zerujesz licznik zamykasz jeden plik i otwierasz następny.

0

Masz tu moją klasę która to realizuje

$map = new \inopx\google\Sitemap( '/home/user/public_html', '/sitemap' );
$map->writeURL('https://adres twojej strony', 0.5);
$map->finish();
<?php
namespace inopx\google;

/**
 * Google sitemap każda instancja obiektu to dany sitemap.
 *
 * Używanie klasy: konstruktorem okreslić katalog i wstępną nazę pliku,
 * następnie metodą writeURL($loc, $priority) wprowadzać linki.
 * $loc - URL, $priority - MOC - od 0.1 do 1, 1 największa moc
 * 
 * Stworzenie mapy:
 * - konstrukcja obiektu
 * - wywoływanie writeURL()
 * - na koniec wywolanie finish()
 */
class Sitemap
{
  /**
   * Nazwa pliku (ale nie pełna ścieżka) ze znakiem "/" na początku ! - bez .xml na końcu ! 
   * Np.: '/map'
   * 
   * @var string  
   */
  public $fileName;

  /**
   * Ścieżka do pliku, ale bez nazwy pliku, bez znaku "/" na końcu.
   * $filepath + $filename = pełna ścieżka do pliku
   * Np.: /home/user/public_html
   * 
   * @var string
   */
  public $filePath;

  /**
   * Maksymalna liczba linków na plik sitemap.
   * 
   * @var type 
   */
  public $fileLimit = 50000;

  /**
   * Aktualny numer pliku. Dodawane na końcu nazwy pliku
   * 
   * @var int
   */
  public $fileNumber = 1;
  
  /**
   * Określenie praw pliku
   * 
   * @var dec
   */
  public $chmod = 0777;

  /**
   * Pointer do pliku
   * 
   * @var resource 
   */
  private $fp;

  /**
   * Jakikolwiek plik otwarty ?
   * 
   * @var boolean
   */
  private $fileOpened = false;

  /**
   * Klasa zakończyła działanie?
   * 
   * @var boolean 
   */
  private $finished = false;

  /**
   * Liczba wszystkich zapisanych linków.
   * 
   * @var int
   */
  public $totalURLAll = 0;

  /**
   * Liczba zapisanych linków w aktualnie otwartym pliku. 
   * 
   * @var int 
   */
  private $totalURLFile = 0;

  /**
   * 
   * @param string $filepath  - typowo root dir serwera www
   * @param string $filename  - typowo "/sitemap"
   */
  public function __construct($filepath, $filename) {
    
    $this->fileName = $filename;
    $this->filePath = $filepath;
  }

  public function __destruct() {
    
    $this->finish();
    
  }



  /**
   * Zapisuje URL do pliku i zwiększa licznik, główna metoda z której się korzysta.
   * 
   * @param $loc - lokacja
   * @param $priority - priorytet: od 0.1 do 1, czym większy tym większa moc
   * @return boolean
   */
  public function writeURL($loc, $priority) {
    
    // Jeżeli osiągneliśmy max liczbę linków,
    // to zamykamy aktualny plik i zwiększamy numer pliku
    if ($this->totalURLFile >= $this->fileLimit) {
      if ($this->closeCurrentFile()) {
        $this->fileNumber++;
        $this->totalURLFile = 0;
      }
      else {
          return false;
      }
    }

    // Otwarcie aktualne pliku (jeżeli trzeba)
    if (!$this->openCurrentFile()) return false;

    $tmp = '<url><loc>'.$loc.'</loc><priority>'.$priority.'</priority></url>'."\n";

    if ($this->write($tmp)) {
      // Zwiększenie licznika...
      $this->totalURLAll++;
      $this->totalURLFile++;

      return true;
    }
    else{
      
      return false;
      
    }
  }

  
  /**
   * Zapisuje dowolną treść do pliku.
   * 
   * @param type $txt
   * @return boolean
   */
  private function write(&$txt) {
    
    $write = fwrite($this->fp, $txt, strlen($txt));

    if (!$write) {
      echo "nie udany write ?<br />\n";
      return false;
    }

    return true;
  }

  /**
   * Kończy pracę klasy, zamykając aktualny plik. Klasa nie powinna być używana po zakończeniu pracy.
   * 
   * @return void
   */
  public function finish() {
    
    if ($this->finished) { 
      return;
    }

    // Zamykam aktualnie otwarty plik
    $this->closeCurrentFile();

    $this->finished = true;
  }
  
  /**
   * Zwraca pełną ścieżkę do do pliku z aktualnym numerem.
   * 
   * @return string
   */
  public function getFullPath() {
    $fnSuff = '';
    if ($this->fileNumber > 1) { 
      $fnSuff = $this->fileNumber;
    }

    return $this->filePath.$this->fileName.$fnSuff.'.xml';
  }
  
  /**
   * Otwiera plik z aktualnym numerem
   * 
   * @return boolean
   */
  public function openCurrentFile() {
    
    if (!$this->fileOpened) {
      
      $fileFullPath = $this->getFullPath();

      try
      {
        $this->fp = fopen($fileFullPath, 'w');
        chmod($fileFullPath, $this->chmod);

        $tmp = '<?xml version="1.0" encoding="UTF-8"?>'."\n".'
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">'."\n";
        $this->write($tmp);

        $this->fileOpened = true;
      }
      catch (\Exception $e)
      {
        error_log($e->getMessage());
        return false;
      }
      
    }

    return true;
  }

  /**
   * Zamyka plik z aktualnym numerem.
   * 
   * @return boolean
   */
  public function closeCurrentFile() {
    
    if ($this->fileOpened) {
      
      $fileFullPath = $this->getFullPath();

      try {
        
        $tmp = '</urlset>';
        $this->write($tmp);
        fclose($this->fp);

        $this->fileOpened = false;
      }
      catch (\Exception $e) {
        error_log($e->getMessage());
        return false;
      }
    }

    return true;
  }
  
}
?>

1 użytkowników online, w tym zalogowanych: 0, gości: 1