Skip to content

Working with the /tmp directory

The system temp directory (/tmp) is a local, writeable path on an application’s web servers on the VIP Platform. The /tmp directory is most commonly used to perform local manipulations to temporary files. For example, transferring a ZIP archive to /tmp, extracting its contents, then uploading the contents to the WordPress site’s wp-content/uploads/ directory on the VIP File System.

All filesystem functions will work as expected in /tmp, including directory traversal.

Considerations

  • Use get_temp_dir() to determine the correct, writable directory path for temporary files.
  • If a temporary file needs to be generated, use wp_tempnam().
  • Use unlink() to clean up and remove all local temporary files after they are no longer needed. Be sure to remove the files before the process that created them terminates.
  • Files and directories can only be relied on for the duration of the current request.
    • Each request may be served by a different container and the sequence of requests from a given user are not guaranteed to be served by the same container.
    • Containers are transient and may be created and destroyed due to autoscaling.

Code example for extracting the contents of a zip file

ZIP files can be uploaded to wp-content/uploads/, but the file’s contents cannot be extracted from within that directory. To extract the contents of a ZIP file, it must be temporarily copied to the system temp directory (/tmp) of an application’s web servers.

The code example below demonstrates this process for a ZIP file that was uploaded to the WordPress Media Library with attachment ID 1234. The ZIP file is programmatically copied to /tmp with the file name updated.csv.zip. The file is then decompressed, and the contents are programmatically uploaded to wp-content/uploads/.

Because the VIP File System lacks a true directory structure, operations like scandir() will not perform as expected. However, in /tmp a true directory structure does exist, and scandir() and other directory-related operations can be used. In a scenario where the name of the extracted file is unknown, the code example below could be modified to use scandir() to read the names of files that are extracted to /tmp.

// ZIP files can only be extracted in the system /tmp directory.
$tmp_path = get_temp_dir();
$upload_dir = wp_get_upload_dir()['basedir'];

// The attachment ID of a ZIP file that was uploaded to the Media Library.
$zip_attachment = get_attached_file( 1234 );

// The path and file name on /tmp where the file will be copied.
$zip_tmp_file = $tmp_path . '/updated.csv.zip';

// Copy the ZIP file to /tmp for extraction.
copy( $zip_attachment, $zip_tmp_file );

if ( file_exists( $zip_tmp_file ) ) {

    $zip = new ZipArchive;
    $result = $zip->open( $zip_tmp_file ); 

    if ( $result === true ) {

        // Extract the contents of the ZIP file to the system /tmp directory.
        $zip->extractTo( $tmp_path );
        $zip->close();

        // For this example, the filename extracted from the ZIP file is known.
        $extracted_filename = $tmp_path . '/csv/updated.csv';
        $file_path = $upload_dir . '/csv/updated.csv';
        
        // Copy the extracted file to wp-content/uploads/
        // Note: copy() will overwrite existing files! 
        // Verify that a file does not already exist with the same name.
        if( ! file_exists( $file_path ) ) {
			copy( $extracted_filename, $file_path );
			// The extracted file is now accessible at:
			// https://example-com.go-vip.net/wp-content/uploads/csv/updated.csv

			// Clean up the extracted file from /tmp
			unlink(  $extracted_filename );
		}

		// Clean up the ZIP file from /tmp
		unlink( $zip_tmp_file )

    }
}

Last updated: February 21, 2024

Relevant to

  • WordPress